Download Firefox -  a safer, easier to use web browser. Return to iribbit.net - Leap into the online experience! Return to iribbit.net - Leap into the online experience! iribbit.net - Leap into the online experience!

Project News :.

I recently began working with isafe.org to help in authoring guidelines for family oriented websites. The goal is to inform parents and other family members how to make sure that their web site, or any web site that they may appear on, is built in a way to maintain a certain or complete level of anonymity to the public eye.

In essence, these guidelines protect you and your family. If you, anyone you know, or if you know your name or picture is on any kind of website, these guidelines offer helpful suggests on how to make sure you do not fall victim to any sort of internet crimes.
Webmaster Guidelines(41kb)
(rough draft)

More information can be gathered by visiting isafe.org or you can download a collection of other guidelines below. These include cyber bullying, email threats, identity theft, intellectual property, internet fraud, malicious code, online personal safety, predator tip, and social networking:
Internet Safety Tip Sheets(445kb)
(collection)


Valid XHTML 1.0 Transitional

Valid CSS!

Section 508 Compliant

powered by: Macromedia ColdFusion MX

made with: Macromedia Dreamweaver MX

What is RSS

XML - often denotes RSS Feed information.

Macromedia - ColdFusion Programming
white horizontal rule

ColdFusion News :.

To bring a little life to my site, I've pulled a couple What is RSS Feeds into this page. You can currently choose between the technology related news stories from the following news sources:



You are currently viewing and RSS Feed from coldfusionbloggers.org.



ExtJS 4.2 Walkthrough Upgrade!
As with all software, each version of ExtJS ships with the following: Bugs Known issues “Would-be-nice” features that didn’t make the prior release Fortunately, the ExtJS team is constantly tweaking, fixing, and improving the framework. With each round of development, they’ll do various releases…some major like 4.2, others minor like the recent 4.2.1. Should I…
(Sat, 25 May 2013 15:00:39 GMT)
[view article in new window]

Ruby: stream-of-consciousness
G'day:
OK, so I'm fiddling around with Ruby (as per my previous post), and am typing this article as I explore.


Prior to starting this I googled "ruby IDE", and saw a lot of advice from people to just use a text editor. There are always people who claim they do all their code in notepad or vi etc, and I always figure they're just trying to sound cool. Whereas I think they just sound stupid, because whilst anyone can type code into a blank, featureless typing window (and we've all had to do emergency hacks on prod servers using vi or notepad, so it's good to not have to rely on code assist, etc), it's not exactly the most professionally productive way of going about one's business.

It seems like the general opinion is to use the plug-in for NetBeans, or a plug-in for Aptana. The plug-in for NetBeans has been discontinued (although someone's blogged how to install it anyway... I might need to look at that later on), so I have installed Aptana as a plug-in to Eclipse, adjacent to my ColdFusion Builder plug-in. This seems to have had the effect of slowing down Eclipse even more, and interfering with my Eclipse config, so this has not impressed me one bit.

One of the Aptana pages I landed on suggested install Ruby via RubyInstaller, which I duly have done, and that all seems to work, which is cool.

I dunno how to do all the IDE-y stuff yet, but I can create a Hello World file and run it from the command line.

Very simple version:

# helloWorld.rb
puts "Hello World"

OO version:

# helloWorldOO.rb
class HelloWorld
def initialize(name)
@name = name.capitalize
end
def sayHi
puts "Hello #{@name}!"
end
end

hello = HelloWorld.new("World")
hello.sayHi

And at the command line:

C:\apps\Ruby200-x64\bin>ruby C:\src\ruby\misc\helloWorld.rb
Hello World

C:\apps\Ruby200-x64\bin>ruby C:\src\ruby\misc\helloWorldOO.rb
Hello World!

C:\apps\Ruby200-x64\bin>

Cool. I'll not try to explain what's going on with that code, as I have no idea. But it's pretty self-explanatory at this level.

Another thing I noticed is that Ruby has a CLI, which one can run using irb:

C:\apps\Ruby200-x64\bin>irb
DL is deprecated, please use Fiddle
irb(main):001:0> puts "Hello World"
Hello World
=> nil
irb(main):002:0>

NB: I am also not vouching for any "best practices" here... I'm just telling you what I'm messing around with.



On the Code School website, I've started the reallyreally beginner "class", which has got me typing stuff into a web-based command interpreter. I'm currently keying in stuff like "4+4" and "Adam" and stuff. Type an expression in, and Ruby evaluates it. I can do the same in my irb window, eg:

irb(main):010:0> 3.14 + 42
=> 45.14
irb(main):011:0>

Ruby seems to be one of these languages in which everything is an object, so the tutorial has had me do this sort of thing:

"Zachary".reverse
(yields "yrahcaZ")

"Zachary".length
(yields 7)

Note how method calls don't need parentheses.

I can also do this, which is neat:

"Zachary" * 5
(yields "ZacharyZacharyZacharyZacharyZachary")

So if one multiplies a string, one gets the string that many times. I tried this:

"Zachary" + 2

And got this:

=> true
irb(main):015:0> "Zachary" +2
TypeError: no implicit conversion of Fixnum into String
        from (irb):15:in `+'
        from (irb):15
        from C:/apps/Ruby200-x64/bin/irb:12:in `<main>'
irb(main):016:0>

Yeah... fair enough ;-)

Continuing with the tutorial, they demonstrate the inverse of me trying to add 2 to a string, by calling reverse on a number (which errors), and then showing how to convert the number to a string, and then it's all good:

irb(main):017:0> 40.reverse
NoMethodError: undefined method `reverse' for 40:Fixnum
        from (irb):17
        from C:/apps/Ruby200-x64/bin/irb:12:in `<main>'
irb(main):018:0> 40.to_s.reverse
=> "04"
irb(main):019:0>

Hmmmm... method names with underscores in them. I don't like that much. Oh well.

The tutorial observes there's a few conversion methods:


Oh... I didn't even know which version of Ruby I was running (OK, I should have guessed from the install path: C:\apps\Ruby200-x64), so googled a way to find out. And found this page. One can do stuff like this:

irb(main):023:0> RUBY_VERSION
=> "2.0.0"
irb(main):024:0> RUBY_PLATFORM
=> "x64-mingw32"
irb(main):025:0> RUBY_RELEASE_DATE
=> "2013-05-14"
irb(main):026:0>

So v2.0.0 it is.

The tutorial continues to explain arrays, and the syntax is familiar:

["tahi", "rua", "toru", "wha"]

And one can call methods directly on the literal array:


["tahi", "rua", "toru", "wha"].length

(yields 4).

Variable assignment is the same as in CFML:

numbers = ["tahi", "rua", "toru", "wha"]

And they observe arrays have a sort method:

numbers.sort

(yields ["rua", "toru", "tahi", "wha"])

There's two different approaches to sorting available. the sort method sorts the input array, returning a new array. the sort! (with the !) sorts the array itself, returning it. EG:

<["whero", "karaka", "kowhai", "kakariki", "kikorangi", "tuauri", "tawatawa"]
=> ["whero", "karaka", "kowhai", "kakariki", "kikorangi", "tuauri", "tawatawa"]
irb(main):036:0> rainbow.sort
=> ["kakariki", "karaka", "kikorangi", "kowhai", "tawatawa", "tuauri", "whero"]
irb(main):037:0> rainbow
=> ["whero", "karaka", "kowhai", "kakariki", "kikorangi", "tuauri", "tawatawa"]
irb(main):038:0> rainbow.sort!
=> ["kakariki", "karaka", "kikorangi", "kowhai", "tawatawa", "tuauri", "whero"]
irb(main):039:0> rainbow
=> ["kakariki", "karaka", "kikorangi", "kowhai", "tawatawa", "tuauri", "whero"]
irb(main):040:0>

Notice how sort doesn't change numbers, but sort! does.

One interesting thing I have noticed. all this code is coming pretty naturally. With the PHP stuff I've been doing recently, I've needed to refer to the docs constantly to remind me what I'm supposed to type in. With this Ruby stuff, it's so "obvious" that it's sticking first time. That say... it's not like I'm doing anything complicated yet.

The next step of the tutorial is a bit gimmicky, but I'll demonstrate it anyhow. Typing this all in line by line in the CLI is a bit messy, so I'll use a file for this. Here we take the first verse of NZ's national anthem, and switch it around, line by line:

# gdnz.rb
anthem = "
E Ihowā Atua,
O ngā iwi mātou rā
Āta whakarangona;
Me aroha noa
Kia hua ko te pai;
Kia tau tō atawhai;
Manaakitia mai
Aotearoa
"
puts anthem

puts "\n"

lines = anthem.lines
reversedLines = lines.to_a.reverse
reversedAnthem = reversedLines.join

puts reversedAnthem

This outputs (the first one is the correct version, the second is the reversed version):

E Ihowa Atua,
O nga iwi matou ra
Ata whakarangona;
Me aroha noa
Kia hua ko te pai;
Kia tau to atawhai;
Manaakitia mai
Aotearoa

Aotearoa
Manaakitia mai
Kia tau to atawhai;
Kia hua ko te pai;
Me aroha noa
Ata whakarangona;
O nga iwi matou ra
E Ihowa Atua,


Of course one could do all this in one statement:

# gdnz2.rb
puts "
E Ihowā Atua,
O ngā iwi mātou rā
Āta whakarangona;
Me aroha noa
Kia hua ko te pai;
Kia tau tō atawhai;
Manaakitia mai
Aotearoa
"
.lines
.to_a
.reverse
.join

Interestingly, I've made a point of spreading all this over multiple lines, and Ruby works out what I mean no problems. That's quite neat.

There's a coupla new methods in there, the doc links for which are as follows:
On the summary page there's an observation that methods can have punctuation in their names (eg: sort!)... that's good clarification: I thought the ! was a modifier, but it's actually part of the method name. Another example given is the include? method, which is quite cool as it works like this:

anthem.include? "Aotearoa"

Which returns true, as anthem does indeed include "Aotearoa".



We're still on the first tutorial, but there's a shift in content so I'll break there.

Next we're looking at hashes, which seem roughly analogous to structs in CFML (so far, anyhow...), and we quickly get into symbols too. The tutorial got me to create a collection of books (the first was its suggestion, the others mine):

# books.rb
books = {}
books["Gravity's Rainbow"] = :splendid
books["London Fields"] = :splendid
books["The Da Vinci Code"] = :abysmal
books["Once Were Warriors"] = :quite_good
puts books
puts books.length

(I've not read Gravity's Rainbow, but I found The Crying of Lot 49 a bit self-indulgent, and have no reason to think GR is any different. The others are my own personal opinion).

This outputs:

{"Gravity's Rainbow"=>:splendid, "London Fields"=>:splendid, "The Da Vinci Code"=>:abysmal, "Once Were Warriors"=>:quite_good}
4


It's nice that Ruby works out that if I tell it to output a hash, it realises it needs to convert it to a string first (which it knows how to do), and does so. Rather than how in CF we'd just get an error. It shouldn't be too much to ask to expect CF to know to JSONify or (given its veneration) WDDXify a struct and then just output it, rather than being unhelpful:

Complex object types cannot be converted to simple values.


Thanks, CF.

Anyway, whilst hashes seem analogous to structs, there's no equivalent to symbols in CFML. I got what symbols were, but the docs for them weren't very descriptive (in a helpful way), so I googled about and came up with two pages which described them well:
So basically they're just a constant label which can be reused in situations like the above: where one wants to use the same value or token repeatedly. Things to note from those pages above are that symbols compare very quickly compared to strings: with two strings, one needs to compare each character; with a symbol, each side of the comparison either is or is not the same token. Also as tokens don't get garbage collected (ever), they can cause memory leaks if used injudiciously. I would say one would need to go mental with them to cause a problem though.

A quick digression:
  • Ruby is case-sensitive. This has been tripping me up when writing the tutorial code;
  • Quotes seems to be interchangeable. The tutorial is using single quotes - which I happen to detest for strings (chars: yes; strings: no. I blame C) - so I've been using double-quotes. They seem to work fine.
Oh bloody hell. The tutorial just got me to type this:

 books.valu­es.each {|rat­e| ratin­gs[rate] += 1}

Err... OK.

What that seems to do (having cheated and looked at the result) is for each of the values in the books hash, increment the key of that value's name in the ratings hash by one. But let me show the code I've typed in to show you what I mean.

# books2.rb
books = {}
books["Gravity's Rainbow"] = :splendid
books["London Fields"] = :splendid
books["The Da Vinci Code"] = :abysmal
books["Once Were Warriors"] = :quite_good
puts books
puts "\n"

ratings = Hash.new(0)
books.values.each {|rate| ratings[rate] += 1}
puts ratings

And the output is this:
{"Gravity's Rainbow"=>:splendid, "London Fields"=>:splendid, "The Da Vinci Code"=>:abysmal, "Once Were Warriors"=>:quite_good}

{:splendid=>2, :abysmal=>1, :quite_good=>1}


Note how it's tallied up the counts for each symbol in the books hash.

Right, so checking the docs, new can take an argument that acts as a default for any preciously unspecified hash entry, which is why when we increment ratings[rate] we don't get an error that it doesn't yet exist. That's neat!

And each does indeed call the following block for each element in the hash. each can pass either the value or the key and the value (if applicable) into the block, as the given name. In the given example we're just iterating over each value, which is a simple value itself, so we only give the anonymous block the value. However we could have been doing this:

books.each {
|title,rating|
puts "Title: " + title + "; rating: " + rating.to_s
}

Wherein we're iterating over each book, and each book has a title (key in this case), and rating (value), so we pass both into the anonymous block. Note how I have to convert the rating to a string before I can concatenate it to the rest of the string, because rating is a symbol, not a string. The output for this is:

Title: Gravity's Rainbow; rating: splendid
Title: London Fields; rating: splendid
Title: The Da Vinci Code; rating: abysmal
Title: Once Were Warriors; rating: quite_good


So that line of code with all the braces and the pipes and stuff looked a bit scary initially, but once one stops to look at it an analyse it slightly, it's all straight forward.

Ooh... the next example of a block is a good 'un:

5.times { print "Odelay!" }

Obviously this prints out "Odelay!Odelay!Odelay!Odelay!Odelay!". But it's quite cool how the combination of  5 being an object, and  having iterative methods like times with anonymous blocks works, innit?

There's another shift in topic now, it looks like we're going to investigate file ops next...



The tutorial has demonstrated two different directory-reading methods:

# dir.rb
(Dir.entries ".").each{
|fileName|
puts fileName
}
puts "\n"

Dir["d*.rb"].each{
|fileName|
puts fileName
}

The output is this (it's of the directory I'm saving the sample files for this article in):

.
..
array.rb
arraySorting.rb
books.rb
books2.rb
books3.rb
books4.rb
dir.rb
gdnz.rb
gdnz2.rb
helloWorld.rb
helloWorldOO.rb

dir.rb


Here we use two different methods of the Dir class. entries returns an array of each file in the specified directory. And the [] method uses a pattern to match files in the current directory.

And do you know what? Ruby has just died a bit for me. The [] method is shorthand for the... the... the bloody glob method. And if you've been following along my forays into PHP, you know my opinion of the idea of calling a method "glob". Grumble.

By default when using Dir the directory is the current directory (ie: that the file was executed from). For example if I was to consider just this code:

# dir2.rb
Dir["*"].each{
|fileName|
puts fileName
}

I'm running this as follows:

C:\src\ruby\misc>ruby dir2.rb

So I get a listing of what's in C:\src\ruby\misc\

If I was to CD up a level and re-run it (I have the ruby/bin dir in my PATH, so can run it from anywhere), I'd get a listing of C:\src\ruby\. The default dir is predicated on where ruby was run from.

I can change the current dir as follows:

# dir3.rb
Dir.chdir "C:/apps/Ruby200-x64"
Dir["*"].each{
|fileName|
puts fileName
}

And this lists the contents of my Ruby install dir instead.

One other thing to note here is if we go back to look at dir.rb again:

(Dir.entries ".").each{

Notice I've got the parentheses around the first bit. Initially I tried to simply do this:

Dir.entries ".".each{

But that didn't work because it was trying to do each on ".", which of course is a) not likely to work as "." is a string and it doesn't have an each method; b) not what I meant anyhow. So the parentheses are just to force the correct order of operations. Sorting this out was another example of Ruby being fairly intuitive. I didn't have to look up what went wrong, I just kinda knew the parentheses would sort things out.

Carrying on with the tutorial it takes me through some file ops, and touches on date functions. There was nothing not completely obvious here, so I'll not go into detail (it copies a file, appends to a file, gets the file's timestamp: boring). But the relevant classes are File and Time. One good thing about the docs is that the URLs are pretty hackable. I wanted to get the docs for the File class, and was currently sitting on the docs for the Dir class (http://ruby-doc.org/core-2.0/Dir.html), and as I've been traversing through the docs, I know to simply change the class name, eg: http://ruby-doc.org/core-2.0/File.html and http://ruby-doc.org/core-2.0/Time.html. This seems trivial, but try doing that with the CFML docs. Or just trying to find the Railo docs ;-)

The tutorial is also telling me it covered using do / end instead of using braces around blocks. I didn't notice this, but I'll take their word for it. Here's a summary anyhow:

# array.rb
numbers = ["tahi","rua","toru","wha"]
numbers.each {
|value|
puts value
}
puts "\n"
numbers.each do
|value|
puts value
end

These output the same thing. So what's the difference. Well from my googling about it seems that braces have a higher precedence in the order of operations, so will always be bound to what's to their immediate left. However do/end have lower precedence, so might behave different. The second comment on this blog entry explains it well. I'll replicate it here:

f g { }

is parsed as f(g { }), where the braces belong to the method g. On the other hand,

f g do end

is parsed as f(g) do end, where the braces belong to the method f.

That's fairly clear, I think. Of course one can use parentheses to avoid this ambiguity in the first place. But I think using braces is clearer anyhow.



Blimey this tutorial is seeming very long (I've been writing this article for 5.5hrs now!) I think if I was not typing this as I went, the tutorial would be about 30min worth of work. Maybe an hour's worth. Oh well... it's certainly going into my head better this way.

Anyway, now we're looking at defining functions. Just looking at the tutorial example, the general form seems to be:

def function_name([arg [,arg[...]])
# expressions
lastExpression
end

eg:

def greet(name)
"G'day " + name
end

puts greet "Zachary"

Note that there's no return statement, simply the value of the last expression is what the calling code receives from the function. Oh: every statement in Ruby is treated like an expression, so returns a value... I shoulda mentioned that earlier, sorry!

The tutorial also contrives a situation to use the require method to basically include some code one of the examples uses.

Next we're looking at classes, and - as we've seen above, once creates an object instance with the new method (it's a method of the Class class), just like we would in CFML.

Creating a class is bloody easy. Check out this basic example:

# PersonClass.rb
class Person
attr_accessor :firstName, :lastName, :dob
end

kid = Person.new

kid.firstName = "Zachary"
kid.lastName = "Cameron Lynch"
kid.dob = Time.new(2011, 3, 24)

puts kid.dob

This outputs Z's birth date:  2011-03-24 00:00:00 +0000

There's no real surprises here... the attr_accessor method defines the properties of the class. Once defined, one can use implicit getter / setter notation on the object instance

I've been doing all this stuff in a file and then running it, but remember I've got the CLI open as well? I can just copy and paste that code into the CLI, and it all just runs fine, line by line

irb(main):100:0> class Person
irb(main):101:1>     attr_accessor :firstName, :lastName, :dob
irb(main):102:1> end
=> nil
irb(main):103:0>
irb(main):104:0* kid = Person.new
=> #<Person:0x00000002e2e558>
irb(main):105:0>
irb(main):106:0* kid.firstName = "Zachary"
=> "Zachary"
irb(main):107:0> kid.lastName = "Cameron Lynch"
=> "Cameron Lynch"
irb(main):108:0> kid.dob = Time.new(2011, 3, 24)
=> 2011-03-24 00:00:00 +0000
irb(main):109:0>
irb(main):110:0* puts kid.dob
2011-03-24 00:00:00 +0000
=> nil
irb(main):111:0> kid
=> #<Person:0x00000002e2e558 @firstName="Zachary", @lastName="Cameron Lynch", @dob=2011-03-24 00:00:00 +0000>
irb(main):112:0>

That is really cool. How useful it is? Hmmm... I've been using Windows too long for me to really get a buzz out of command-line hacking like some people do, but it's good to know it's there if one needs it. And I'm sure people will pipe up with a good use case. I suppose I still do a bunch of stuff with MySQL via the command line, so it's the same sort of thing. I'm just more familiar with MySQL than I am with Ruby (albeit I'm so rusty with MySQL, there's probably not much in it any more!).

The next step in the tutorial is adding a constructor method to the class, eg:

# PersonClass2.rb
class Person
attr_accessor :firstName, :lastName, :dob

def initialize (firstName, lastName, dob)
@firstName, @lastname = firstName, lastName
@dob = dob
end

end

kid = Person.new "Zachary", "Cameron Lynch", Time.new(2011, 3, 24)

puts kid.dob

initialize is the equivalent of init() in CFML. Also note the @varName syntax for instance variables. And the slightly weird way one can assign multiple values to multiple variables at the same time.



And that's it. The last few pages of the tutorial went back over some array methods, but they weren't anything noteworthy.

I actually feel I know a bit about Ruby now. And I've only completed one of the seven tutorials on it they have. I'm absolutely fried after this... not the tutorial itself, but the seven hours I've been writing this blog article. Still: it filled up the afternoon. And you have something to read.

I'm gonna do the other tutorials too, and I'll write up my findings as I go.

Interestingly... I think I now know more about Ruby than I do about PHP. And which one of these am I supposed to be learning? Oops.

In closing: Ruby looks like quite a good language. I have only a superficial knowledge of it, but I found myself going "hey cool!" quite a bit as I worked through the tutorial and messing around with the sample code here. And having read each page of the tutorial or the docs, I found it very easy to write the code almost intuitively. I don't even get that feeling writing CFML even now, after a dozen years. I know better what to do in CFML, but until I've rote-learned something, it's not exactly intuitive. Which is odd for a language that claims it's dead easy to get up to speed with development in. It's interesting having a new perspective on this sort of thing.

Right... I deserve a beer. I'm going up the road to have one.

--
Adam
(Sat, 25 May 2013 14:07:26 GMT)
[view article in new window]

Ruby via codeschool.com
G'day:
Cheers to Ray Camden for putting me on to this, but Code School are offering free online training all weekend, thanks to some outfit called New Relic sponsoring it. Yay for Code School & new Relic!

I was planning on doing some summery stuff like going into the forest and getting a decent dose of greenitude and vitamin D, but it's bloody freezing (10degC @ midday, about a week from the start of "summer"!) so I'm staying indoors and am gonna work my way through the Ruby courses they offer. If I find anything interesting - which I presume I will - I'll write it up.

However I had better also dose up on various forms of caffeine first, as I've already sat at this blimin' computer for 4h today, and my attention span is waning.

Wish me luck (not with the Ruby, but with not freezing to death en route to the station for a coffee ;-).

--
Adam














(Sat, 25 May 2013 07:27:39 GMT)
[view article in new window]

212 untriaged ColdFusion 10 bugs
G'day:
I saw this on Twitter last night, and - predictably - it f***ed me right off.


From: James Moberg @gamesover
To: @Adobe @coldfusion
I want to upgrade to #ColdFusion 10, but not if issues exist & aren't even being actively reviewed. Need help?

From: Adobe ColdFusion @coldfusion
To: @gamesover @Adobe
Can you provide the bug numbers if you have already logged them? We will review the same.

From: James Moberg @gamesover
To: @coldfusion @Adobe
Use search feature ow.ly/lmysL Type=Bugs Only, Product=#ColdFusion, Version=10, State=Open, Status=Unverified

From: Sean Corfield @seancorfield
To: @gamesover
CC:
@dacCfml @Adobeis that right? 212 unverified bugs reported against @coldfusion 10? 

To which the response was (initiated by me, followed-up by others):


From: @dacccfml
To: @seancorfield @gamesover @coldfusion @Adobe
Yep, that's what I see as well. 212 publicly visible bugs in an enterprise (priced) product that the vendor hasn't even bothered to triage. That's very disrespectful of their clients

From: Jason Brookins @twinsploitation
To: @dacCfml
Trying to get to Railo as quickly as possible; this just adds impetus.

From: Adam Cameron @dacCfml
To: @twinsploitation
@coldfusion @Adobe
Indeed. Do you know what though, it's not that there's a lot of bugs - everything has bugs - it's just that they can't even be arsed checking to see if there are any significant problem being raised. Or respecting their clients enough to bother suggesting they give the slightest shit.

From: am2605 @am2605
To: @dacCfml
this makes me sad more than angry. I wish we could all chip in and buy it off them and give the poor thing a good home
Please note: the 212 figure Sean cites is not "bug and feature requests", it's just "bugs". And it's not all bugs. It's just the ones that are a) open; b) haven't even been looked-at by Adobe. And just for ColdFusion 10.

I know I said it in the Twitter exchange, but to re-iterate: it's just completely unacceptable that the Adobe ColdFusion Team have such a shitty attitude towards their clients. Their paying clients. Clients who pay thousands and thousands of dollars / pounds for their product. And who have clearly been caught out by these bugs, so they are affecting people in a real world way, and enough so that they take the time to raise said bugs with their vendor, Adobe. This is borderline professional negligence on the part of Adobe (actually I'm not sure which side of the that particular border it's on!).

I hasten to add I do not blame the bulk of the Adobe ColdFusion Team for this. The developers won't be at fault here because they will just be doing what they're told. And clearly they've been told to ignore the bugbase. However I do firmly blame whoever is the decision-maker in that process.

I've been part of assessing the upgrade of a pretty bloody big ColdFusion install from CF9 to CF10 recently. I hasten to add I'm not one of the decision-makers in this and I will not express the opinions of the decision-makers here (I don't know their opinion, for one thing), but I will say that the upgrade involves licensing costs measured in the tens of thousands of pounds (many tens of thousands of pounds). If it was entirely my decision as to the direction to take, the fact that Adobe have 212 untriaged bugs sitting in their public bugbase would weigh heavily on me: why would I be wanting to give Adobe all that money for... nothing. For apathy. For client neglect.

To repeat what I touch on about, I actually don't have much of a problem with the number of bugs in total. Everything has bugs. And there's a good chance a lot of those 212 bugs will be minor, or so trivial as to not even warrant the time taken to raise them, or not actually bugs but people misunderstanding something. However a lot will be genuine bugs, and some might be serious bugs. But we wouldn't know, would we? Because no-one's bothered to look at them.

This paints a very poor picture of Adobe's focus on ColdFusion. Yet another one.

And let's not forget we're only talking ColdFusion 10 bugs here. What about the other metrics:

VersionUnverifiedVerifiedNotes
BugsFeaturesBugsFeatures
8.01011(incl 1 "fixed" but still "to test")
8.0.111211-
9.021073(incl 4 "fixed" but still "to test")
9.0.111010354(incl 10 "fixed" but still "to test")
10.02127919232(incl 15 "fixed" but still "to test")


So it's not like there's a policy of them to simply ignore everything, or they're just not updating the bugbase. They do look at stuff. They've verified almost as many bugs as they've ignored in CF10. So they really honestly actually haven't bothered to took at those 212 James / Sean singled out.

It's also worth pointing out that the CF Team have fixed really a lot of issues too.  There's 515 open issues for CF10, but 362 closed ones. For 9.0.1 it's better reading: 398 closed to 159 open. 9.0: 1550 closed; only 31 open. CF8.x: 1082 closed vs 18 open. So they do plug through the work. But that doesn't excuse not at least triaging all the stuff that people have taken the time to raise with them, at least as a professional courtesy.

If you want to know what 212 untriaged ColdFusion bugs looks like... here they all are:






















































































































































































































#CreatedIDSummary
12012-04-173167817Running Web Server Configuration tool on one site throws a 500 error
22012-05-043182493 with no expires attribute managing session (CFID / CFTOKEN) browser only cookies results in persistent cookies
32012-05-073183868ORM Search Serialization Issue
42012-05-223196322path_info breaks Flash forms
52012-05-223196326CF9.0.1 vs CF10 wrt cfgrid + bind = floating point
62012-05-263199273When using offline AIR support, certain class property names need escaped
72012-05-263199274When using offline AIR support, the actionscript load(cls, object, ignoreLazyLoading) method is broken
82012-05-263199275When using offline AIR support, the client-side [Transient] metadata is already used for another purpose.
92012-06-053206530Spring integration, spring security and jsp tags
102012-06-133213501Conflict with Microsoft Exchange and Handler Mappings
112012-06-203219587UPgrading from CF 9 to CF 10 leaves connectors to CF 9 causing issues.
122012-06-253222889GetPageContext().getRequest().getParameter('param_name') is undefined
132012-07-103283049Dockable Debugging Error
142012-07-203292315cftrace "fatal information" image is not displayed properly
152012-07-283298213Various Charts Will not render in IE7
162012-08-023301875Login method on cfide.adminapi.administrator component failing intermittently
172012-08-063303777CFGRID doesn't set values in HTML like CF9 but will work if format is changed to flash.
182012-08-073304661unable to register C++ CFX tag in 32 bit CF on 64-bit OS.
192012-08-173312917CF9 won't uninstall; CF10 is a nightmare to install
202012-08-223315764CFFlush doesn't work.
212012-08-223315766CFChart Tooltips not working correctly on Google Chrome
222012-08-223315776CFChart does not recognize "animate" or "detach" values when using format=html and JSON style file
232012-08-233316776arrayFindNoCase() returns false negatives
242012-08-233316784arrayFindAllNoCase() returns false negatives
252012-08-233316788arrayFindAll() returns false positives
262012-08-233316798arrayDelete() returns false positives
272012-08-273318699Tomcat connector, isapi_redirector 1.2.32 issues
282012-08-303321646Deprecate CFLOOP/array and try again
292012-09-033323375HTML cfchart ignores labelFormat attribute
302012-09-043324252IE9 fails but Firefox fine.using cfwindow and cfgrid.
312012-09-103328113Cannot access CF Admin after install
322012-09-133330734Dynamically Typed Queries with '300D' in the first row.
332012-09-133330785CGI Scope geting reset by websocket handler
342012-09-213334751AJAX XHR Upload (application/octet-stream) after update from coldfusion 9 to 10
352012-09-223335478Unable to delete a REST service
362012-09-223335493Caching issue
372012-09-223335505[ANeff] Bug for: Incorrect task status when action="list" omits task="" attribute
382012-09-243335956[ANeff] Bug for: ArrayContainsNoCase and ArrayDeleteNoCase are missing
392012-09-243336205[ANeff] Bug for: cfschedule falsely says exclude date format invalid
402012-09-243336210[ANeff] Bug for: cfschedule's exclude disallows date and range combination
412012-09-253336302using functions of an included file makes coldfusion ignore imports
422012-09-263337394Function SerializeJSON() converts employee's last name ("No") to boolean false in JSON output
432012-09-273338329Dumping an entire object that extends a parent class displays metadata for overridden functions from parent instead of child
442012-09-283338790OrmSearch does not include result score + entity for queries generating a single result
452012-09-283338825SerializeJSON casts multiple zero value as number instead of string
462012-09-293339105valueList() should take any expression that evaluates to a query column
472012-09-293339126CFFeed does not extract content element xml:base attribute from atom feeds
482012-09-303339175"coldfusion status" command fails silently on Linux
492012-10-013339690Starting Solr on RHEL 6 64 bit
502012-10-033340537[ANeff] Bug for: Wish form links to old cfbugs.adobe.com
512012-10-053341684Redirection to URL in IIS6 website redirecting to /jakarta/isapi_redirect.dll
522012-10-053341910SQL Server 2008 (or newer) HierarchyID datatype not supported by CF10 jdbc driver (works in CF8)
532012-10-063342124XML serialization for REST services is not escaping some values.
542012-10-073342141Source code file should not need special charset encoding instructions for them to compile properly
552012-10-093342986[ANeff] Bug for: WebSocket open/closeConnection() return undefined instead of boolean
562012-10-093342991[ANeff] Bug for: typo subscribercount_callbackHanlders (dl, not ld) in cfwebsocketChannel.js
572012-10-093342995[ANeff] Bug for: typo in WSPublish() exception
582012-10-093343006[ANeff] Bug for: invokeAndPublish() returns no error when channel doesn't exist
592012-10-093343429A cfm page is set as a custom error page for a website in IIS, does not work as expected
602012-10-103344090pageEncoding only works in CFCs
612012-10-103344353Web services will not be served from https with stock CF10 install
622012-10-113345011error "javax.mail.MessagingException: Unable to load BODYSTRUCTURE" when using CFIMAP
632012-10-113345191isValid 'Email' validation allows underscores in email form
642012-10-113345255function call structure creation occasionally executes before the line in code is run
652012-10-113345316[ANeff] Bug for: WebSocket unsubscribe() invokes afterUnsubscribe() twice
662012-10-143346117[ANeff] Bug for: restInitApplication("absolute path",..) null pointer in Application.cfc pseudo-constructor
672012-10-173348475Concurrency issue accessing / verifying a datasource - "could not locate" datasource
682012-10-173348765[ANeff] Bug for: REST app will crash if installed on multiple sites
692012-10-183349444IIS Physical Path can't see Google Drive folders
702012-10-193350030Some Query of Query errors are 500 errors
712012-10-223351326.NET Integration Services grayed out during the sub component installation of Coldfusion server on windows 8
722012-10-233351451Cannot edit or delete scheduled tasks
732012-10-243352451CF 9 scheduled tasks not migrated during CF 10 install and unable to re-create them manually on Win 2008 Server
742012-10-253352745properties with default values not accessible outside init function
752012-10-253353222ColdFusion 10 doesn't gzip responses. This worked fine with the same configuration in ColdFusion 9.
762012-10-253353254ColdFusion doesn't properly start or restart if ethernet is down even if loopback is up
772012-10-253353358cfajaxproxy generates incorrect javascript when machine restarted
782012-10-253353515CFSelect Google Chrome
792012-10-263354038Scheduled Tasks disappear after restart - Update 3 broke
802012-10-273354476Session reset on each page load on IE for certain machines
812012-11-033358792WSConfig does not back up all the config files it changes
822012-11-033358817Application.cfc-set mappings don't work in onApplicationEnd()
832012-11-063360511CFDBINFO doesn't know to escape reserved words
842012-11-063360524"unique" constraint on ORM-mapped properties not respected when DB is Derby
852012-11-073361502No setting in cluster admin to enable session replication
862012-11-073361929CFSTAT server port conflict in multiserver configuration
872012-11-093363329onMisfire attribute of cfschedule docs & tag behavior don't match & include duplicate arguments (fire_now vs. firenow)
882012-11-093363366Application mappings failing with a REST call
892012-11-133364745Web Server Configuration Tool doesn't work for "All" sites in IIS 7
902012-11-143365388AWS Elastic Beanstalk rejects ColdFusion WARs
912012-11-153365773cflayout - tab height problem in IE 7
922012-11-153366005Default document not working
932012-11-193367866"Select all" option in ColdFusion updater doesn't work
942012-11-193367872Updater should leave the system how it found it
952012-11-213369252CF9 Query of Queries on CF10 Query object only returns the first row
962012-11-283373247isJSON throws exception
972012-11-293374680CFDocument won't embed Helvetica font
982012-11-303375263Misleading error with REST services and missing returnType
992012-11-303375431Unable to access delegated calendar using cfexchangeConnection
1002012-12-033376486restSetResponse with a header can cause an error.
1012012-12-033376670Remove spreadSheetReadBinary
1022012-12-043377595Bundled jIntegra is 32bit on 64 Bit Windows
1032012-12-053378447Java Servlet Exceptions prevent ColdFusion10 server from starting
1042012-12-123427668cfinfo reports wrong version number
1052012-12-123427695CFLOOP over a list should have includeEmptyValues attribute
1062012-12-123427961Changing Task Name causes CTASK error and tasks deletes itself
1072012-12-143429588isCustomFunction() needs to do what it says on the box
1082012-12-173430245Session gets lost on cflocation width J2EE Sessions and Cookies disabled
1092012-12-173430402CFPDFFORM fails on Linux
1102012-12-183431165CFFILE - Unable to set MS Office MIME Types if OpenOffice installed
1112012-12-183431423INSERT query on Oracle database with maxrows attribute on cfquery tag crashes
1122012-12-233433620ImageGetEXIFMetadata is not working as expected
1132012-12-233433621CFIMAGE action="write" is not maintaining EXIF Metadata info of an image
1142012-12-263434100Updating a task via cfschedule resets task to defaults
1152012-12-263434101cfschedule missing values for attributes
1162012-12-263434106Code Hinting
1172012-12-293434535param statement with no default creates spurious variables
1182012-12-303434560CFDUMP tag doesn't collapse in Opera
1192012-12-313434633Enterprise Manager: Element httpport is undefined in a Java object of type class java.util.HashMap.
1202013-01-013434652Parser bug in function with typo in it
1212013-01-043436101NULL NULL errors after the last coldfusion update
1222013-01-073442915Installation fails on IIS 7.5 without CGI but does not alert the user to it
1232013-01-153476230event gateway services won't start/stop from cfadmin.
1242013-01-153476661deserializeJson does not properly handle high-ascii characters
1252013-01-163477538cfajaxproxy and cfcomponent extends no longer work in CF 10 when using IIS Virtual Directories
1262013-01-183485286ColdFusion not exposing exceptions correctly
1272013-01-223486707[ANeff] Bug for: Admin API's login() treats ishashed=false as ishashed=true
1282013-01-253489921The value of isDSTOn returned by GetTimeZoneInfo always seems to be no
1292013-01-253490112SEVERE: Error in getRealPathFromConn persists after Updating Coldfusion
1302013-01-273490441Using the word "required" with a leading underscore in the name attribute of a cfinput field
1312013-01-283491238NumberFormat returns different results with optional placeholders
1322013-01-293492574[ANeff] Bug for: CF installer migrates ODBC data sources w/ wrong port
1332013-01-293492580[ANeff] Bug for: ODBC DSN creation fails in non-cfusion instances
1342013-01-293492608[ANeff] Bug for: ODBC DSN deletion fails in non-cfusion instances
1352013-01-293492620[ANeff] Bug for: 64-bit CF10 creates wrong registry entries for ODBC data sources
1362013-01-303493209CFPresentation tag throws file not found error when trying to create a presentation with a VFS destination
1372013-01-313493990CFPDF doesn't add headers/footers to PDF files
1382013-01-313494006Calling Oracle Package: [Macromedia][Oracle JDBC Driver]User defined type not found: SYS.DBMS_UTILITY
1392013-01-313494045Coldfusion Errors when parsing "Reporting" form submission from Captivate
1402013-02-123498968Some web services with data structure as argument values could not execute
1412013-02-123499114JBoss 6
1422013-02-173501428Scheduled task does not allow ":" in url
1432013-02-193502465Manage Colelction Values not saved
1442013-02-193502742Nested loop over [] array notation throws compiler error
1452013-02-203503303hover tips for resume and pausing tasks need to be switched
1462013-02-203503472Creative Cloud 6 fonts corrupt the ColdFusion CFPDFFORM tag (not cfform)
1472013-02-203503539Cannot Delete Log Files
1482013-02-213504508Installer option to install local documentation
1492013-02-253506225argumentcollection bugs with numeric keys
1502013-02-263506891CFM can't find a CFC in the same directory.
1512013-02-273508034Flashservices Gateway Configuration
1522013-02-283508651Bug in writeDump() / CFDUMP with non-contiguous-numerically-keyed argumentcollection
1532013-03-033511958ColdFusion Sandbox Security Breaks Active FTP Connections
1542013-03-043512735cftextarea richtext does not load in Internet Explorer 10 (Windows 8)
1552013-03-043512854Error connecting to Oracle servers using Oracle Advanced Security
1562013-03-063514590Annotations with ":" do not work inline in script based functions
1572013-03-063514766Problem adding Scheduled Task on system with different Format and Display settings that runs on Java 7
1582013-03-073515355Adobe ColdFusion 10 Extensions for Dreamweaver Removes HTML5 Tags
1592013-03-073515644CFHTTP with compression="none" fails to decode deflated http response
1602013-03-083516357Connection verification failed for data source: csvfiles
1612013-03-103516836Error updating a scheduled task on day of Daylight Saving Time
1622013-03-113517457ColdFusion mappings are ignored when using REST services
1632013-03-123518496Administrator throws errors on managing scheduled task with space at end of name
1642013-03-133519649Could not find the included template
1652013-03-153521203CFThread loses Attributes collection inside Custom Tag.
1662013-03-153521227Page Level Caching Does Not Work Correctly For Application Specific Caches
1672013-03-193525182CFGRID HTML version issue
1682013-03-193525473Mail spooler jam due to SpoolLockTimeoutException
1692013-03-213526880cfimport doesn't resolve /../ correctly in cf10. It did in cf9
1702013-03-213527009Caused by: java.lang.NullPointerException On CreateObject
1712013-03-273530880App Pool Crashing "Randomly". "Load balancing workers will not function properly." in isapi_redirct.log at crash time.
1722013-03-283531688There was an error accessing this page. Check logs for more details.
1732013-04-013533394CFIDE available even with no virtual directory
1742013-04-023534348Typographical errors in $cfroot/cfusion/bin/cf-init.sh
1752013-04-043536062In memory file system limit cannot be more than JVM max heap size
1762013-04-053536673Problem with empty CGI variables/Windows authentication in CF10/IIS 7.5
1772013-04-053536920A query object with a column type "object" becomes column type "longvarchar" after being converted to WDDX and back
1782013-04-093538759Adding a domain requires restart of Cold Fusion
1792013-04-093539041coldfusion-out logs stuff targeted for other logs
1802013-04-09(Sat, 25 May 2013 06:52:01 GMT)
[view article in new window]

Confessions of a Serial Hackathoner.
Hello World, It’s been a very busy few months for me. New Projects! New Languages! More Hackathons! Yes, you heard that right, Hackathons. “Hi, My Name Is Theo and I’m A Serial Hackathoner” In case you’re wondering, “just what is a Hackathon?” I’ll give it to you short and sweet straight from the one resource […]
(Fri, 24 May 2013 18:01:09 GMT)
[view article in new window]

CF Webtools is Hiring Full Time Remote Developers

Mark Kruger, aka. ColdFusion Muse posted that CF Webtools is hiring again. Check it out!

CFWebtools is location in Omaha, NE, but we have a large number of remote employees and contractors. If you are interested,read the job posting at the link above and contact us.

A couple highlights:

Frequently Asked Questions

  • Do you allow telecommuting? Yes all our development positions are full-time remote positions.
  • What sort of dev environment can I expect? We are en eclipse shop and rely on SVN, Jenkins, and an agile like approach to development. Having said that, as an outsource development company we frequently integrate with external teams. That means you can't always predict everything about the approach for the project you are working on.
  • What Industries are you working in? We have sites we develop and maintain in the Financial sector (stocks, options, commodities, retirement planning and management etc.), Insurance, Medical, Pharmaceutical, retail sales, real estate, etc. We have a very broad client list.
  • Will I get to meet the Muse? Yes of course... you'll be sick of me inside of two weeks.
  • Do you use frameworks? Yes - all of them all the way back to Fusebox 2. We work on new projects in common frameworks like FW/1 or DI/1, but we also support a host of legacy applications done on custom frameworks or with no framework at all.

I've been with CF Webtools since December of 2010 and it's a good place to work.


(Fri, 24 May 2013 15:17:17 GMT)
[view article in new window]

Using MariaDB with Mango Blog

In one of my previous posts I went over connecting ColdFusion to MariaDB. This was my first hands on with MariaDB. Once I had things talking I went to test using MariaDB as the database to connect with Mango Blog.

Initially, when switching, I was able to view the main pages - posts and the other content. I could log in to the admin as well; but upon trying to create a post or edit content, I would get a ColdFusion error regarding invalid MySQL syntax. Looking back on how I set up MariaDB to CF, I had used the "other" option when adding a data source in the CF Admin. Since Mango Blog's setup allows for using MSSQL and MySQL, there was most likely a hang-up in identifying what DBMS was actually being used. I'm not entirely sure as I have not pursued this error fully.

The solution that works actually came in part to a comment made on the above referenced post. Since MariaDB is a fork of MySQL, when setting up a MariaDB data source in the CF Admin, you don't have to go the "other" route. Instead you can simply use the "MySQL 4/5" option and, in the "Server" field, specify the URL and port to MariaDB. This will hook things up more or less the same as using the "other" option but the key difference here is that the underlying reference to the DBMS will still come off as MySQL from CF.

When connected in this way you can easily choose that data source as a MySQL database to use with Mango Blog; but it will in fact be using the MariaDB database. So far in my tests everything runs and functions as expected. Obviously there is the possibility for this to fail in the future as features / inner-workings of MariaDB shift from MySQL. Of course this was more experimental than anything.

Cheers.


(Fri, 24 May 2013 14:11:57 GMT)
[view article in new window]

PhoneGap Online/Offline Tip
A few months ago I wrote a blog post that talked about "robust" PhoneGap applications. Basically it was a look at the types of things you should consider to make your PhoneGap application more of an app and less of a wrapped web page.One of the main topics of that blog post was about handling connection status. PhoneGap gives you access to the type of connection the device has as well as events that let you respond to online and offline states. These are important features that (most likely) every single PhoneGap app should be using. I want to point out though a small issue with the code I shared. It isn't broke, but how I did things could be done slightly different. Consider this code block: I want you to notice two things. I've got event listeners for my connection status. Then I have an immediate check. My thinking was, "I want to know when things change in the future but I also need to know what's going on right now." However, it turns out that this isn't actually necessary. If you add event listeners for the online/offline events in the main body load event (not the PhoneGap device ready), then the appropriate event will be fired automatically. If you read the docs for the events (http://docs.phonegap.com/en/2.7.0/cordova_events_events.md.html#online) closely you will see that they demonstrate using the body load event. What may not be clear from the docs though is that even though your connection may not change, the event really is fired for you. Here is an example that I've slightly modified from the docs. Using this way of handling the events, I would not need a check in onDeviceReady. Thanks go to fellow Adobian Shazron for pointing this out. So... do you have to use this way of handling it? To be honest, I prefer my way. It is a bit more coding, but I'd rather not have onload event with logic and a ondeviceready. My way just "feels" better to me, but I reserve the right to change my mind in the next five minutes. ;)
(Fri, 24 May 2013 10:30:49 GMT)
[view article in new window]

On Working Remotely (Telecommuting)

I've been wanting to share my tips for being productive while working from home full time for a while now, but never got around to writing them all out. As luck would have it, I ran across an article that covers almost everything...

I've had the good fortune to spend the last year-plus working at CounterMarch, which is to say working from home. We don't have an office to which I could commute if I wanted to -- but that's ok, because I don't. I've also been fortunate enough to have a few jobs that allowed me occasional telecommuting privileges in the past, but there's something substantially different about doing it full time.

Because of all of this working from home, I feel like I've gotten pretty good at it. Most days I'm very pleased with my productivity, and on days when I'm not I can usually trace it back to a particular client issue (in which case I'm billing them, so their roadblocks become their loss) or service issue (in which case I go on the war path). On the rare day that I feel like it was something environmental or my own lack of motivation or energy that caused my productivity drop, I also feel like the good days outnumber the bad ones by a significant margin, and write it off to the law of averages.

There are a lot of fairly-obvious productivity tips for working from home full time that this article covers, so start with that.

Good, now that you've read that article, let me expand on it a little bit here and there...

Workspace

The missing element here is that your workspace needs to be desirable. The more uncomfortable and gloomy your workspace is, the more you'll dread work and the more you'll want to get out of there. If, instead, your workspace has the best stereo in the house (if you're into music) or if you invest in a super high-end chair (seriously, buy me this chair!), and your desk is functional and inviting, and the room is well lit, then you'll find you would rather sit in your office than on the couch.

All of the above said, one of the best perks about working from home is that when the weather is right you can take your work out onto the back porch and soak up some Vitamin D (and if the boss is amenable, perhaps a tasty adult beverage)! Why not work outside when the timing is right?

And speaking of leaving your office... assuming you're geographically close(ish) to some or all of your team, get together every once in a while. Steve and I originally planned to meet once a month at a central location (the Whole Foods in Plymouth Meeting is tremendous for this!), but for whatever reason we're both usually too busy to make it happen that frequently. It usually works out to more like every 2-3 months. However, after every one of those get-togethers I feel recharged and ready to take on new problems. It's nice to be reminded you're not alone.

I also like to take one or two days between Whole Foods meetups to work from my favorite greasy-spoon diner or hole-in-the-wall bar (or both!). You can't beat cheap scrapple and free wifi, and the change of pace of getting out of the house is like a reset button if you feel a rutt settling in.

Communication

Steve and I are often both so busy that we barely type 10 messages back and forth throughout the day -- and chat/IM is our primary mode of communication. We do use email a bit more than is recommended in the article, but my rule of thumb is:

  • If I need an answer sooner rather than later: IM/chat is appropriate (I expect a response within 10-15 minutes and usually get one within 30s to 5 minutes)
  • If I know Steve is busy with a client or even if I just know I won't need the answer for at least 6 hours: email is better. The subtext is: If this was truly important, I would have IMed you, so just get to it when you can.

That said, sometimes the stars align and we both sit in a Google+ Hangout literally all day. It's kind of the greatest thing ever. We can water-cooler chat while we work for a bit, and then we settle into a comfortable silence punctuated by occasional F-bombs directed at semicolons or service providers. Got a question? Just ask it out loud.

The all-day hangout thing isn't for everyone, and even for us it's something we manage probably once every week or two.

Love thy job

The last thing I have to add is that when you love your job, it's not hard to be productive. I think I looked at reddit twice today, and one of those times was on my phone while I ate my lunch. The rest of the day I just grabbed the top card from the to-do column in Trello for my project, did the thing, and moved it to the column to the right.

Cultivate a career that makes all of the hardships worthwhile. Here's an excerpt from the offer letter I got from CounterMarch:

The byproduct will be great software that hopefully makes us a pile of money. Remember what I told you: the money is but a byproduct of doing what we do in such a manner that we want to keep doing it. -- Steve Rittler (I hope he doesn't mind me reproducing it here!)

... And it has been true. I see myself growing and getting smarter with every project. I feel lucky to have reached this point in my career in my early 30s, and I will have been even luckier if I can ride this wave until I retire.

When you've got a boss that prioritizes interesting work over lucrative work, that understands the benefits of peace & quiet, and that wants nothing more than for you both to enjoy your work so much that you want to continue doing it... how can you not be productive?

If you don't have those things, keep looking. Don't quit your job until you've got something better lined up, but never settle. And if you can't find that dream job, perhaps it's time to become that boss.


(Fri, 24 May 2013 09:45:33 GMT)
[view article in new window]

Connecting to JNDI data sources in ColdFusion 10

Here's a guide to show you how to configure JNDI datasource in ColdFusion 10.

1. Get the JDBC Driver

The JDBC Driver needs to be placed in ColdFusion10/cfusion/runtime/lib folder.

2. context.xml configuration

Add a resource block before the closing tag (</Context>) in the context.xml present at ColdFusion10/cfusion/runtime/conf , which defines database connection detail :

<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"

          maxActive="50" maxIdle="30" maxWait="10000"

          username="username" password="password"

          driverClassName="com.mysql.jdbc.Driver"

          url="jdbc:mysql://localhost:3306/test"/>

For more information on the attributes please refer to http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html.For setting isolation level use the defaultTransactionIsolation attribute.

3. web.xml configuration

In the web.xml present at ColdFusion10/cfusion/wwwroot/WEB-INF , add the following just before the closing tag (</web-app>):

<resource-ref>

<description>MySQL Datasource example</description>

<res-ref-name>jdbc/test</res-ref-name>

<res-type>javax.sql.DataSource</res-type>

<res-auth>Container</res-auth>

</resource-ref>

 

4. Add ColdFusion DataSource through Administrator

After saving the configuration files restart the ColdFusion server.Log in to ColdFusion Administrator and navigate to Data & Services > Data Sources and add a new Data Source by selecting J2EE Data Source(JNDI) in the driver drop down.For more details on this refer http://help.adobe.com/en_US/ColdFusion/10.0/Admin/WSc3ff6d0ea77859461172e0811cbf364104-7fdf.html .

Data Source registration page

 

Hope you found this useful.Write in to us if you have any issues with the Tomcat specific configuration.

 

-Asha


(Fri, 24 May 2013 09:00:28 GMT)
[view article in new window]


© The connection to the COLDFUSIONBLOGGERS's RSS feed has timed out - please try again later. We are sorry for any inconvenience this may have caused.