One thing that would be great here would be autocompletion. I often forget exactly what the syntax of "CREATE TABLE" is or which options I can use. The same goes for infrequently used SQL functions (now is that date_diff or datediff?).
You could combine autocompletion with a doc panel that automatically updates to show the "quick reference" for the keyword you're currently typing.
Slightly off-topic, but one thing that always impressed me about Microsoft's LINQ as an alternative to SQL queries is that they considered autocompletion up-front in the language syntax.
For SQL, it's a big challenge - you may type in 'SELECT', but your IDE still has no idea what relation(s) you're going to access, and so it can't reasonably autocomplete the possible fields you might want to use.
It's an interesting example of a language that was arguably designed for human readability in the small ('give me this from that cross-referenced with this other thing'), but in some sense became a weakness of sorts later on.
One way to approach it would be to have a grab bag of templates. You drag a template like "SELECT ... FROM ... WHERE ..." out into the editor and then tab through it filling in the blanks.
I've always thought that SQL's notion of readability was somewhere between superficial and disingenuous - you can read the query and it sounds like it ought to make sense, but there's so many occasions where you won't actually be able to understand why it isn't working unless you know how to translate in your head from the order in which the clauses are written, to the order in which they're carried out.
True - but so much of the value of autocomplete comes from just being able to try things out:
'from customers, orders select ...'
Would allow showing a whole bunch of columns, and you could quickly determine whether those tables had the information you're after, or not.
It might seem strange/lazy that the developer can explore the environment (schema) this way without 'knowing' what's out there, but in practice that's exactly what we all do with software development, web search, etc - we try things out and see what comes back, rather than knowing in the first place. Data development has a way to go, but I think things will improve..
Actually, one alternative approach would be: use a search index to autocomplete after even a basic 'SELECT' statement (no other context), but then fill the FROM clause based on the selection.
i.e. - type:
'select city'
prompts with:
'city (table airports)'
'city (table populations)'
'city (table companies)'
And then, upon selection, you have a statement: 'select city from <selected-table>'.
There's a lot more here though. Worth pondering for a while I think.
To clarify: it was the SQL, not LINQ, language syntax (field selection prior to relation selection) that I was referring to as a potential weakness (but only once considered in the light of developer tools).
Absolutely. The "get something from somewhere" syntax that SQL employs is completely at odds with it being declarative. LINQ simply does a better job of capturing the abstractions of relational algebra cleanly.
Not that it really matters to someone who is already familiar with SQL, however.
I don't have that feature exactly, but I can offer this - if you have a table of regularly-formatted text data, you can paste it into the "Text-to-DDL" feature to have it automatically generate your CREATE TABLE and INSERT INTO statements.
Re: 2) Some day when I have a huge amount of free time, I would like to migrate to Groovy on Grails. Until then - CF is what I had used for over a decade, and it was the easiest thing for me to use to build with at the time (Jan 2012). I was more interested in getting something out there than using whatever the latest trendy tech.
pud's latest project is still on the homepage of HN and he wrote it in CFML: https://news.ycombinator.com/item?id=6519743 Just because project X is not written in your language of choice, means absolutely nothing. Its all about execution and this project is pretty impressive.
Sorry, but choice of language means more than nothing. ColdFusion is pretty dead-end and not a particularly good choice these days for a variety of reasons.
Let me break it for you, nobody except you and some opinionated programmers on the web, cares what language you wrote website X or web app Y in. If it works, and you are able to maintain it - you won't hear a single word of praise from the 'users' congratulating you on your stellar choice of language. They'll rip you to shreds when it stops working but even then they'll never tell you off for choosing the wrong language.
If it works, and you can maintain it - its all good. Even Cold Fusion, even PHP, even Perl, even Brainf#@k
I understand your point of view, and in specific cases, the choice has little practical impact. However, when a business is dependent on an aging technology (language/framework/etc), the choice can have real consequences. As one example, when that very competent programmer who has expert level knowledge in this aging technology decides to move on, if the technology isn't well supported by a vendor, user community, and/or local talent pool, the business can be in a real bind.
As we (I work for Adobe!) have talked publicly about the next rev of ColdFusion, and have shown features, talked about focus areas, etc, it is certainly not dead-end in terms of active product development.
I agree that Adobe's ColdFusion is deadend but not Open Source Railo which is more of a Java Framework. At the end of the day there's no logical reason against CFML any more than there is against PHP, Rails, etc.
>ColdFusion is... not a particularly good choice these days for a variety of reasons.
Not that I disagree with you, but I wonder if the reasons you have in mind are valid. A lot of the reasons one might assume CF sucks aren't really applicable (i.e. speed, security) any more than most other languages.
I assume all major-ish choices have decent speed, security, etc. The main things are activity, books, resources, people to hire, libraries, support, etc.
If I remember correctly, F#&@ed Company, pud's old wonder box of startup gossip was also done in ColdFusion (though in those days it was quite a good platform to do web stuff).
I disagree with you here. Although I would not choose ColdFusion for anything these days, in 1998/1999 it was a super fast way to get a web site/app together. Post 2000 it was converted to Java and became a glorified JSP tag library. It was a good platform that didn't stand the test of time.
I remember it being quite horrible around that time. But, as you say, a fast way to get a site together. I maintain that PHP was actually less worse, and I despise PHP with a contempt that would give [INSERT DICTATOR HERE] pause.
Lol, no one really. Just a few obscure organizations like NASA, Apple, Pud's DistroKid/Fandalism, Intel, AT&T, and tons of others. Oh and railo is a java framework, who uses java!? Its 2013!
Just like Coldfusion, many people have been saying Java is so 1995 but since Twitter showed how well Java scales compared to the woeful RoR it is seeing a renaissance. And since Railo is a Java framework that speeds development I have a feeling we will being seeing it experience a similar renaissance in the near future.
The majority of Internet companies operating at scale likely have services running on the JVM. They might be writing Scala – Twitter, LinkedIn, say – but it's still the Java ecosystem.
basically when wheels throws an error, it will try to send out an error email containing the environment and framework information. In this case there seems to be no smtp server defined, so CFML itself is spitting up its skull.
The error handling can be reworked so that the $mail() call is wrap in a try/catch so the 500 page will just be shown.
Me? Because I have to maintain a rather old site for my employer, and there is absolutely no chance that anyone would sign-off on migrating it to a different platform.
Interestingly, about a year ago, we were told that we would no longer be doing any updates to the system, and yet, here we are, a year later, still doing minor releases. I suspect it will never go away.
Can someone explain how leaking a traceback is a security flaw, considering it's a lot less information than just releasing the source code (which we do all the time and don't consider it a security flaw)?
There's nothing inherently insecure about it, it's just more information that a potential attacker has to use against your system. Obviously, if someone breaks into your system from the information in a traceback, it's likely because of a deeper security hole in your system, so hiding tracebacks is just security through obscurity, but given the choices of publicly showing this information vs not, it's better not to.
WRT to open source: in open source software, you theoretically have many benign eyes vetting your code for security issues, whereas with closed source applications, the only people who are looking for security holes are you and attackers. :)
Hundreds of prominent public companies have their investor relations (/ media relations) site served by coldfusion (including facebook, yahoo, ebay, paypal, EA, ...)
Can't tell if sarcastic or not. Seeing how you link to the giant security fiasco caused by a cold fusion 0 day I'm assuming this is not a recommendation.
ha, I came here to say pretty much this, except I'd finish with 'fortunately' - I was reluctant to engage when I was first introduced, but Coldfusion has been pretty good to me.
It pops up constantly on StackOverflow and I've found it incredibly useful for interviews. I noticed recently that the Execution Plan was added which just opens more avenues for teaching & interviewing.
no SMTP Server defined
at railo.runtime.net.smtp.SMTPClient.send(SMTPClient.java:676):676
at railo.runtime.tag.Mail.doEndTag(Mail.java:519):519
at wheels.global.cfml_cfm$cf._1(/root/sqlfiddle/src/main/webapp/wheels/global/cfml.cfm:93):93
at wheels.global.cfml_cfm$cf.udfCall(/root/sqlfiddle/src/main/webapp/wheels/global/cfml.cfm):-1
at railo.runtime.type.UDFImpl.implementation(UDFImpl.java:215):215
at railo.runtime.type.UDFImpl._call(UDFImpl.java:434):434
at railo.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:377):377
at railo.runtime.util.VariableUtilImpl.callFunctionWithNamedValues(VariableUtilImpl.java:774):774
at railo.runtime.PageContextImpl.getFunctionWithNamedValues(PageContextImpl.java:1495):1495
at wheels.events.onerror_cfm$cf.udfCall(/root/sqlfiddle/src/main/webapp/wheels/events/onerror.cfm:42):42
at railo.runtime.type.UDFImpl.implementation(UDFImpl.java:215):215
at railo.runtime.type.UDFImpl._call(UDFImpl.java:434):434
at railo.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:377):377
at railo.runtime.tag.Invoke.doFunction(Invoke.java:224):224
at railo.runtime.tag.Invoke.doEndTag(Invoke.java:191):191
at wheels.global.cfml_cfm$cf._1(/root/sqlfiddle/src/main/webapp/wheels/global/cfml.cfm:44):44
at wheels.global.cfml_cfm$cf.udfCall(/root/sqlfiddle/src/main/webapp/wheels/global/cfml.cfm):-1
at railo.runtime.type.UDFImpl.implementation(UDFImpl.java:215):215
at railo.runtime.type.UDFImpl._call(UDFImpl.java:434):434
at railo.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:377):377
at railo.runtime.util.VariableUtilImpl.callFunctionWithNamedValues(VariableUtilImpl.java:774):774
at railo.runtime.PageContextImpl.getFunctionWithNamedValues(PageContextImpl.java:1495):1495
at wheels.events.onerror_cfm$cf.udfCall(/root/sqlfiddle/src/main/webapp/wheels/events/onerror.cfm:14):14
at railo.runtime.type.UDFImpl.implementation(UDFImpl.java:215):215
at railo.runtime.type.UDFImpl._call(UDFImpl.java:434):434
at railo.runtime.type.UDFImpl.call(UDFImpl.java:384):384
at railo.runtime.ComponentImpl._call(ComponentImpl.java:615):615
at railo.runtime.ComponentImpl._call(ComponentImpl.java:502):502
at railo.runtime.ComponentImpl.call(ComponentImpl.java:1815):1815
at railo.runtime.listener.ModernAppListener.call(ModernAppListener.java:349):349
at railo.runtime.listener.ModernAppListener.onError(ModernAppListener.java:336):336
at railo.runtime.PageContextImpl.execute(PageContextImpl.java:2045):2045
at railo.runtime.PageContextImpl.execute(PageContextImpl.java:2002):2002
at railo.runtime.engine.CFMLEngineImpl.serviceCFML(CFMLEngineImpl.java:297):297
at railo.loader.servlet.CFMLServlet.service(CFMLServlet.java:32):32
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722):722
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305):305
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210):210
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225):225
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169):169
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168):168
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98):98
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118):118
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407):407
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200):200
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565):565
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307):307
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source):-1
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source):-1
at java.lang.Thread.run(Unknown Source):-1
As a guy about to finish up school and make his way into the work force, would you be willing to release some of the questions you use in interviews. It be neat to see which areas I need to patch up knowledge wise!
It will be back up and running shortly!