The document discusses various ColdFusion features for more modern coding, covering:
1. CFML history and top features introduced over different ColdFusion versions from CF1 to CF11.
2. CFScript support, including syntax examples for tags without bodies, tags with bodies, loops, if/else statements in both tag and script formats.
3. The queryExecute function, member functions, Elvis operator, closures, map and reduce functions, and first class functions/callbacks in ColdFusion.
If you are like most CFML developers the application you work on has been around for a few years. The task of securing your legacy application code from vulnerabilities can be an overwhelming and time consuming task. Many developers don't know where to start, and never do.
This session will arm you with an approach slaying the legacy security vulnerabilities in your CFML code.
Can you contain the future - Docker, Container Technologies, The Future, and YouColdFusionConference
Linux containers and Docker have been all the rage in sysOps for quite some time now. Come to this session to learn about how you can or if you should be using them, and to learn about container technologies, how thy differ from VMs and if they truly are the future. Take a look at Docker basics and get an understanding of how it can be used as part of your workflow, not just for development, but for production deployments as well. We will also bust some Myths surrounding container technologies and Docker.
In The Trenches With Tomster, Upgrading Ember.js & Ember DataStacy London
A few months after I started working with Ember.js & Ember Data at my new job we began a project to upgrade both. There were parts that were a breeze and others that were quite tricky. This talk walks you through some of the challenges we faced and how we solved them as well as how we began to prepare for the Ember 2.x architectural shift. Hopefully this talk will help save you some time when you decide to upgrade your Ember web application.
If you are like most CFML developers the application you work on has been around for a few years. The task of securing your legacy application code from vulnerabilities can be an overwhelming and time consuming task. Many developers don't know where to start, and never do.
This session will arm you with an approach slaying the legacy security vulnerabilities in your CFML code.
Can you contain the future - Docker, Container Technologies, The Future, and YouColdFusionConference
Linux containers and Docker have been all the rage in sysOps for quite some time now. Come to this session to learn about how you can or if you should be using them, and to learn about container technologies, how thy differ from VMs and if they truly are the future. Take a look at Docker basics and get an understanding of how it can be used as part of your workflow, not just for development, but for production deployments as well. We will also bust some Myths surrounding container technologies and Docker.
In The Trenches With Tomster, Upgrading Ember.js & Ember DataStacy London
A few months after I started working with Ember.js & Ember Data at my new job we began a project to upgrade both. There were parts that were a breeze and others that were quite tricky. This talk walks you through some of the challenges we faced and how we solved them as well as how we began to prepare for the Ember 2.x architectural shift. Hopefully this talk will help save you some time when you decide to upgrade your Ember web application.
Take home your very own free Vagrant CFML Dev Environment - Presented at dev....Gavin Pickin
Vagrant is a great solution for providing all of your devs a standard dev environment, but like all the other great technology out there, you have to learn it, and then implement it.
Not anymore, this session will give you a well used, documented Vagrant Setup, with the flexibility to use it for all of your future dev projects too. Learn how this Vagrant Environment is setup, and how to extend it. Kill the learning curve, and spin it up today.
This setup is being used by several devs, on several projects, and has simple flexibility built in. Drop your repos in the main folder, follow simple conventions, and add a small amount of configuration and be able to spin up your environment in minutes. This setup can configure a simple welcome page, configure the web server and cfml engine mappings, datasources, web server settings per site, host entries, and much more.
As great as this sounds, nothing is ever perfect, learn how some assumptions left me looking silly, and owing another developer a meal, and how I resolved that issue and made this vagrant setup even better.
Microsoft has traditionally been a laggard in the JavaScript space, making such developers question whether their war cries were being heard aloud. Fortunately, the situation is rapidly improving since the release of Visual Studio Code. Code is a free, lightweight, cross-platform code editor which is sure to change your perception of Microsoft.
This presentation will demonstrate how to utilize popular JavaScript tooling within the editor. The focus will be placed on the first-class support for debuggers, linters, transpilers, and task runners.
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016Gavin Pickin
Everyone who wasn't writing JavaScript, probably is now. Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.
That's great, but how do we test it? In ColdFusion we have CFCs, most languages have classes... but JavaScript doesn't have classes (yet).
So how do I write unit tests, what units are there, and how do I make my code look like that? JavaScript is a flexible language, and with great flexibility comes great complexity and responsibility. Take your JavaScript spaghetti and make it unit testable.
Attendees should have some exposure to JavaScript, but this is for the Professional Newbie... who always needs to learn and adapt.
In this advanced session, we will investigate all the ways that you can automate your testing processes with TestBox and many CI and automation tools. From Jenkins integration, Travis CI, Node runners, Grunt watchers and much more. This session will show you the value of continuous integration and how to apply it with modern tools and technologies.
OroCRM Developer Community Webinar slides. This webinar took place on May 28, 2014 and was delivered by Yoav Kutner, CTO and Co-Founder of OroCRM, previous CTO and Co-Founder of Magento, Dima Soroka our VP of Engineering, and Ignat from our Core Development Team. Learn the latest product news, best practices, and OroCRM future roadmap
In this advanced session, we will investigate all the ways that you can automate your testing processes with TestBox and many CI and automation tools. From Jenkins integration, Travis CI, Node runners, Grunt watchers and much more. This session will show you the value of continuous integration and how to apply it with modern tools and technologies.
Main Points
Why we want to automate
Continuous Integration
ANT/CommandBox Test Runner
Setup of a Jenkins CI server
Travis CI integration
Pipelines CI integration
Node TestBox Runners
Grunt Watchers and Browser Live Reloads
Una dura accusa di Gianni Lettieri a chi resta a guardare senza mai intervenire, soprattutto nel caso di Napoli, che necessita un maggiore impegno della società civile e di chi non si è cimentato in politica in passato.
Take home your very own free Vagrant CFML Dev Environment - Presented at dev....Gavin Pickin
Vagrant is a great solution for providing all of your devs a standard dev environment, but like all the other great technology out there, you have to learn it, and then implement it.
Not anymore, this session will give you a well used, documented Vagrant Setup, with the flexibility to use it for all of your future dev projects too. Learn how this Vagrant Environment is setup, and how to extend it. Kill the learning curve, and spin it up today.
This setup is being used by several devs, on several projects, and has simple flexibility built in. Drop your repos in the main folder, follow simple conventions, and add a small amount of configuration and be able to spin up your environment in minutes. This setup can configure a simple welcome page, configure the web server and cfml engine mappings, datasources, web server settings per site, host entries, and much more.
As great as this sounds, nothing is ever perfect, learn how some assumptions left me looking silly, and owing another developer a meal, and how I resolved that issue and made this vagrant setup even better.
Microsoft has traditionally been a laggard in the JavaScript space, making such developers question whether their war cries were being heard aloud. Fortunately, the situation is rapidly improving since the release of Visual Studio Code. Code is a free, lightweight, cross-platform code editor which is sure to change your perception of Microsoft.
This presentation will demonstrate how to utilize popular JavaScript tooling within the editor. The focus will be placed on the first-class support for debuggers, linters, transpilers, and task runners.
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016Gavin Pickin
Everyone who wasn't writing JavaScript, probably is now. Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.
That's great, but how do we test it? In ColdFusion we have CFCs, most languages have classes... but JavaScript doesn't have classes (yet).
So how do I write unit tests, what units are there, and how do I make my code look like that? JavaScript is a flexible language, and with great flexibility comes great complexity and responsibility. Take your JavaScript spaghetti and make it unit testable.
Attendees should have some exposure to JavaScript, but this is for the Professional Newbie... who always needs to learn and adapt.
In this advanced session, we will investigate all the ways that you can automate your testing processes with TestBox and many CI and automation tools. From Jenkins integration, Travis CI, Node runners, Grunt watchers and much more. This session will show you the value of continuous integration and how to apply it with modern tools and technologies.
OroCRM Developer Community Webinar slides. This webinar took place on May 28, 2014 and was delivered by Yoav Kutner, CTO and Co-Founder of OroCRM, previous CTO and Co-Founder of Magento, Dima Soroka our VP of Engineering, and Ignat from our Core Development Team. Learn the latest product news, best practices, and OroCRM future roadmap
In this advanced session, we will investigate all the ways that you can automate your testing processes with TestBox and many CI and automation tools. From Jenkins integration, Travis CI, Node runners, Grunt watchers and much more. This session will show you the value of continuous integration and how to apply it with modern tools and technologies.
Main Points
Why we want to automate
Continuous Integration
ANT/CommandBox Test Runner
Setup of a Jenkins CI server
Travis CI integration
Pipelines CI integration
Node TestBox Runners
Grunt Watchers and Browser Live Reloads
Una dura accusa di Gianni Lettieri a chi resta a guardare senza mai intervenire, soprattutto nel caso di Napoli, che necessita un maggiore impegno della società civile e di chi non si è cimentato in politica in passato.
Delingskultur for Sparebanken Møre Arena Ålesund 10.januar 2017Jørn Kippersund
Fra sending til deling. Mindre støy, bedre kunnskapsdeling og prosjektflyt. Ved bruk av delingsplattformer i stedet for epost, åpnes kommunikasjonen opp og gjøres tilgjengelig kontekstuelt, i stedet for å bli låst inne hos enkeltmedlemmer i organisasjonen. Epost egner seg som varslingskanal, men ikke til formidling av orginialinformasjon
Writing an AngularJS application with TypeScript takes a lot of pain out development process and how helps in learning the AngularJS API and best practices. In this session I will show the best practices for building an AngularJS app with TypeScript and explain why the two are a great combination. Some of items we will cover include: authentication, authorization, controllers with ControllerAs, services, minification, and routing. We will also talk about how to use the TypeScript tooling to make learning and working with the AngularJS API easier while automating the compilation process.
Floorplan (http://www.vlsisystemdesign.com/PD-Flow.php)VLSI SYSTEM Design
https://www.udemy.com/vlsi-academy
Floorplanning is basically the arrangement of logical blocks (i.e. multiplexer, AND, OR gates, buffers) on silicon chip.
Omnichannel Marketing leicht gemacht: Lernen von den BestenMayoris AG
Referat an der SuisseEMEX'16 von Urs Thüring & Cyrill Gross, Mayoris AG
Omnichannel Marketing ist in aller Munde. Doch wie oft bei Trendthemen eilen die diskutierten Konzepte und Visionen der Realität weit voraus. Wir zeigen anhand von Beispielen was heute bereits gemacht wird und was möglich ist. Angereichert mit einem kleinen Exkurs in die Theorie.
This is my presentation about CFWheels at CFObjective ANZ, November 2010, Melbourne, Australia.
ColdFusion on Wheels (CFWheels), is an elegant framework inspired by Ruby on Rails.
[Session given at Engage 2019, Brussels, 15 May 2019]
In this session, Tim Davis (Technical Director at The Turtle Partnership Ltd) takes you through the new Domino Query Language (DQL), how it works, and how to use it in LotusScript, in Java, and in the new domino-db Node.js module. Introduced in Domino 10, DQL provides a simple, efficient and powerful search facility for accessing Domino documents. Originally only used in the domino-db Node.js module, with 10.0.1 DQL also became available to both LotusScript and Java. This presentation will provide code examples in all three languages, ensuring you will come away with a good understanding of DQL and how to use it in your projects.
Setting up your Multi Engine Environment - Apache Railo and ColdFusionGavin Pickin
Presented at cf.Objective() May 2014.
More info and resources related to presentation available here
http://www.gpickin.com/cfo2014/
Description of Target Audience
Are you a developer looking to setup Multiple CFML Engines in your Development or Server Environment, and after reading all of the different blogs out there, just want a walk through, to help clear things up, well, this session is for you.
Assumed Knowledge
None required, although basic installation / configuration or a web server and cfml engine would be easier to follow along.
Objective of the Topic
To give the audience all the knowledge and resources they need to be able to go home and install their own multiple cfml engine environment.
This topic will help walk the audience through dos and don'ts, and with a step by step on how to get Apache, Railo and Coldfusion to all play nicely together. There are many blogs out there showing users how to set up one engine, or another, but this session will help clear up the process. We will install Apache and connect to Coldfusion, Railo and a Railo Cluster, and install a small App to help manage the Websites, Apache, and Connectors, to save you diving into the CONF files continuously.
Why am I qualified to Present
I have been programming Coldfusion for over 14 years, and having been Team Lead and responsible for Server Install, Maint and Configuration for the last 13 years at 2 companies, I have been involved with the day to day coding in Coldfusion, but also the one in the firing line if Coldfusion server is not performing as required.
Recently my team and I have undertaken a migration Project of 100+ CFML websites (varying types and age), in which testing multiple CFML engines was required, I setup our Dev Staging and Production servers, as well as our Local Developer environments.
I built a couple of tools to help manage the setup, which I will share with the audience.
What Will the Audience Learn
- Basic Apache Config
- How to Install Coldfusion and extract the Connector
- How to Install Railo (instances) and extract the Connector
- How to Setup and Connect to a Railo Cluster
- How to edit the Apache and Tomcat Conf files to make them easier to maintain
- How to use my small App to Manage the Apache / Tomcat configurations
Language Basics | Coldfusion primer | Chap-1Nafis Ahmed
This chapter on Adobe ColdFusion, elaborates on the basics of this HTML-like language. It starts with the by introducing the viewer/reader with the variables, comments and the tags that are behaves like HTML, yet can alternatively be made to syntactically look like other programming languages like PHP. Then, it moves onto examples that demonstrates the ability of structures, lists, variables, loops, conditionals and finally the switch-case statement. This presentation concisely attempts to show the prospective CF programmer that how a old code can be recycled, reinvented, innovated and at the same time made as safe as possible, after all, security is a major concern in today's world.
Learn how to take advantage of the Pebble build system by creating customized wscripts that let you concatenate JS files, automatically run linters, and internationalize your apps with Cherie Williams (Developer Evangelist).
The Hitchhiker's Guide to Faster Builds. Viktor Kirilov. CoreHard Spring 2019corehard_by
C++ is known for things such as performance, expressiveness, the lack of a standard build system and package management, complexity and long compile times. The inability to iterate quickly is one of the biggest killers of productivity. This talk is aimed at anyone interested in improving the last of these points - it will provide insights into why compilation (and linking) take so long for C++ and will then provide an exhaustive list of techniques and tools to mitigate the problem, such as: - tooling and infrastructure - hardware, build systems, caching, distributed builds, diagnostics of bottlenecks, code hygiene - techniques - unity builds, precompiled headers, linking (static vs shared libraries) - source code modification - the PIMPL idiom, better template use, annotations - modules - what they are, when they are coming to C++ and what becomes obsolete because of them
101 general overview of Coldbox 4, its features, and ecosystem.
the core MVC and conventions of Coldbox
what is/is not included in Coldbox 4
intro to main Box libraries and how they integrate into the core
perhaps show off some basic CommandBox usage in the Box ecosystem
Basically, an entry level, concise run thru. The kind of talk that would be accessible/educational for a new Coldbox user, helpful refresher for intermediate users, and a decent promo for those interested in maybe picking up Coldbox for the first time.
Flink Forward Berlin 2018: Edward Alexander Rojas Clavijo - "Deploying a secu...Flink Forward
One of the main sources of concerns when switching to the container paradigm is security. When dealing with big amounts of sensitive customer data it’s very important to be able to guarantee that the data is transported safely between the different components of the system. This talk will focus on how to setup a Flink cluster to run on a Kubernetes environment taking into account all security aspects to ensure secured communication between the nodes of the cluster, state backend and also for job submission, all taking advantage of Kubernetes tools.
LiveCycle Data Services for ColdFusion DevelopersSteven Erat
Discussions of Adobe's LiveCycle Data Services are often entered with the same trepidation as those of Organic Chemistry or Quantum Mechanics, but with ColdFusion, building Web applications that manage complex data sets doesn't have to be that scary. Data Management is a pillar of LCDS that offers scalable, real-time data synchronization across very large numbers of connected clients with the benefits of conflict resolution and data pagination. Come learn how to quickly get up to speed with Data Management by letting ColdFusion do the hard work for you.
Everyones invited! Meet accesibility requirements with ColdFusion
Cfml features modern_coding
1. CFML Features for
More Modern Coding
Dan Fredericks
fmdano@gmail.com
@fmdano74
http://www.meetup.com/nvcfug/
2. What this Presentation will cover:
• CFML History of top features
• CFScript Support
• QueryExecute() Function
• Member Functions
• Elvis Function
• Closures
• Map and Reduce
• First Class Functions and Callbacks
• CF 12 Special
3. ColdFusion Feature History
• ColdFusion 1: CF1 was an interesting animal, it predates the CFML language, back then it was DBML (Database
Markup Language) and it used a tag named <dbquery> to define a query and then <dbsql> to append SQL to that
query. There was a <dbset> a <dbif> and not much else.
• ColdFusion 2: CF2 introduced CFML, and introduced dynamic SQL built within a <cfquery> tag.
• ColdFusion 3: CF3 was less significant for the language, and more for the introduction of CF Studio.
• ColdFusion 4
• Invoke Java Objects
• ColdFusion 5
• Macromedia
• CFScript-based UDFs
• ColdFusion 6
• Server rewritten in Java (MX)
• CFML Language API with an OOP Interface
• ColdFusion MX 7
• Flash-Based forms
• Report builder
4. ColdFusion Feature History
• Adobe ColdFusion 8
• CFPDFFORM integrate with Acrobat forms
• .net integration (http://www.Microsoft.com/net)
• Built in AJAX widgets
• Array and structure improvement
• CFPDF
• Some CFScript enhancements
• ColdFusion 9
• More CFScript support
• Explicit local scope
• getters/setters in CFC’s
• Init (implicit constructions via method) in CFC
• ORM
5. ColdFusion Feature History
• ColdFusion 10
• Security enhancements
• Tomcat Integration
• Restful web services
• Hotfix Updater in Admin
• Language enhancements – Closures, CFScript, etc.
• ColdFusion 11
• Full CFScript Support
• Member Functions
• Elvis Operator
• queryExecute
• built in functions elevated to first-class functions
6. CFScript
• Seems like first CFScript was implemented in CF 4.0
• Tags seemed ok back then because pre CFC’s (CF Components)
• Used UDF’s and Custom Tags to reuse and separate code
• CF MX (6.0) brought about CFC’s so separation of code
• CFCs - you create methods, which are ColdFusion user-defined functions, in the
component page. You pass data to a method by using parameters. The method then
performs the function and, if specified in the cfreturn tag, returns data.
• CF 9 added script based cfc support
• You could write a full CFC with cfscript and not need to include code in cfscript block
• CF11 adds full Script Support
• most of the cfscript example will be CF 11 unless otherwise noted
7. CFScript
• Community has different opinions on using Tag vs Script
• Using MVC Tags on View, Script on Controller and Model
• Script syntax is cleaner
• Closer to other ECMA script languages
• Lots of tag syntax is more characters
• I am more comfortable with Tags
• Documentation is lacking for Script (check cfdocs.org)
• Tags were superior for SQL integration (talk about this later)
• Newer features such as Closures are script based
• Do what is best for you but try to be consistent!!!
9. CFScript
• There are some tags that have multiple implementations
• These implementations are due to old syntax or dual syntax (CF9 cfc’s)
<cfscript>
//CF9 syntax
thread action=“run” name=“testName” {
thread.test = “CFML”;
}
//CF11 syntax
cfthread( action=“run” name=“testName”){
thread.test = “CFML”;
}
<cfscript>
12. CFScript
Tag Example
• Loop
<cfloop from=“1” to=“10”index=“i”>
<cfoutput>#i#</cfoutput>
</cfloop>
Script Example
• For Loop
for (i=1; i <=5; i++) {
// all statements in the block are looped over
result = i * 2;
writeOutput(result);
}
• While Loop
while (condition) {
// statements
}
18. QueryExecute
• CFQUERY has been the staple to query a database since day 1
• There have been a few attempts to query the database using script
• Here is the latest alternative for script based syntax
Syntax:
QueryExecute( sql_stmt, queryParams, queryOptions );
19. QueryExecute
Old Script Syntax
<cfscript>
q = new com.adobe.coldfusion.query();
q.setDatasource("cfartgallery");
q.setSQL("select * from art
where artname like :search or description like :search");
q.addParam(name="search",value="%e%",cfsqltype="cf_sql_varchar");
r = q.execute();
</cfscript>
20. QueryExecute
New Script Syntax
queryExecute( sql_stmt, queryParam, queryOptions);
Numbers =
(1) queryExecute(“
SELECT *
FROM art
WHERE artname like ‘%this%’
ORDER BY id“,
(2) {type={value=“number”, cfsqltype=“cf_sql_varchar”}},
or {value=“color”},
(3) {datasource = “scratch_mssql”}
);
21. QueryExecute
queryExecute( sql_stmt, queryParam, queryOptions);
Tag Syntax
<cfquery name=“qryResult”>
SELECT *
FROM Employees
</cfquery>
Script Syntax
qryResult = queryExecute(
"SELECT * FROM Employees“
);
Note: queryExecute is just a
function so can be used in tags as
well:
<cfset temp = queryExecute(…) >
22. QueryExecute
queryExecute( sql_stmt, queryParam, queryOptions);
Tag Syntax
<cfset country = “USA” />
<cfset empid = 1 />
<cfquery name=“qryResult”>
SELECT *
FROM Employees
WHERE empid = #empID#
AND country = #country#
</cfquery>
** Should use cfqueryparm
Script Syntax (Parameters using Struct)
qryResult = queryExecute(“
SELECT *
FROM Employees
WHERE empid = :empid
AND country = :country",
{country="USA", empid=1}
);
23. QueryExecute
queryExecute( sql_stmt, queryParam, queryOptions);
Tag Syntax (Specify a datasource)
<cfquery name=“qryResult”
datasource = “myDatasourceName”>
SELECT *
FROM Employees
</cfquery>
Script Syntax (Specify a datasource)
qryResult = queryExecute(“
SELECT *
FROM Employees",
{},
{datasource=
"myDataSourceName"}
);
24. QueryExecute
queryExecute( sql_stmt, queryParam, queryOptions);
Tag Syntax (query with a subquery)
<cffunction name=“getEqMfg” returntype=“query” access=“public”>
<cfargument name=“dc” cfsqltype=“string” required=“true”>
<cfquery name=“ml” datasource=“myDSN”>
Select name, mfgCode, country
From mfgdetails_tbl
Where mfgcode in (
Select mfgCode
From mfg2devices_tbl
Where deviceCode =
<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.dc#“ maxlength=“5”> )
Order By country, name
</cfquery>
<cfreturn ml >
</cffunction>
Script Syntax (query with a subquery)
public query function getEqMfg(required string dc){
var ml = queryExecute("Select name, mfgCode, country
From mfgdetails_tbl
Where mfgcode in (
Select mfgCode
From mfg2devices_tbl
Where deviceCode = :dcp
)
Order By country, name",
{dcp={value="dc",cfsqltype="CF_SQL_VARCHAR", maxlength=5 }},
{datasource = “myDSN”}
);
return ml;
}
25. QueryExecute
queryExecute( sql_stmt, queryParam, queryOptions);
Tag Syntax
(Return a number/count or maxRows)
<cfquery name=“dsc”>
Select count(*) as qty
From generic_view”
</cfquery>
<cfquery name=“sc” maxrows=“#rc#”>
Select specialtyname, qty
From generic_view
Order by qty DESC, specialtyname
</cfquey>
Script Syntax
(Return a number/count or maxRows)
public numeric function getSpecialtyCount(){
var dsc = queryExecute("Select Count(*) as qty
From specialtycategorycount_view");
return dsc.qty;
}
query function getSpecialtyCodeChartData(required numeric rc=99){
var sc = queryExecute("Select specialtyname, qty
From specialtycategorycount_view
Order by qty DESC, specialtyname",
{}, {maxrows = "rc"});
return sc;
}
27. Member Functions
• Member Functions are operators and functions that are declared as a
member of a class.
• These are more in line with true object oriented style of coding
• Member functions can also be chained together
Formats:
Old:
ArrayAppend(empArr, emp)
structIsEmpty(empStruct)
New:
empArr.append(emp)
empStruct.isEmpty()
28. Member Functions
List of data types supported:
• String: stringVar.find()
• List: listVar.listFind()
• Array: arrayVar.find()
• Struct: structVar.find()
• Date: dateVar.dateFormat()
• Image: someImage.crop()
• Query: queryVar.addColumn()
• Spreadsheet: spreadsheetVar.writ()
• XML: xmlVar.search()
Chaining: stringVar.find(“I like cfml”, “cfml”).uCase()
29. Member Functions
Regular CF function syntax
dateTimeFormat(
dateAdd( 'd', -5, now() )
, 'yyyy-mm-dd' );
dateTimeFormat( dateAdd( 'd', -5, now() ), 'yyyy-mm-dd' );
Note: dateTimeFormat function was added in
CF10, combo of dateTime and timeFormat.
Member Function syntax
now().add( 'd', -5 )
.dateTimeFormat( 'yyyy-mm-dd' );
now().add( 'd', -5 ).dateTimeFormat( 'yyyy-mm-dd' );
30. Member Functions
A chaining example:
s = "The";
s = s.append("quick brown fox", " ")
.append("jumps over the lazy dog", " ")
.ucase()
.reverse();
writeOutput(s);
Result: GOD YZAL EHT REVO SPMUJ XOF NWORB KCIUQ EHT
s.append("quick brown fox", " ").append("jumps over the lazy dog", " ").ucase().reverse();
31. Member Functions
Regular CF function syntax
var myArray = ArrayNew(1);
ArrayAppend(myArray, "objec_new");
ArraySort(myArray, "ASC");
Member Function syntax
myArray.append("objec_new");
myArray.sort("ASC");
32. Member Functions
• Important Note on a potential Member Function Gotcha:
• Some member functions might fall into underlying Java methods if the strict
ColdFusion syntax is not followed.
• https://bugbase.adobe.com/index.cfm?event=bug&id=3753710
33. Member Functions
• Resources
Adobe ColdFusion wiki: https://helpx.adobe.com/coldfusion/developing-
applications/building-blocks-of-coldfusion-applications/using-the-member-functions.html
34. Elvis Operator
• The Elvis Operator added in ColdFusion 11
• It works like a Ternary Operator; it's a decision making operator that
requires three operands: condition, true statement, and false
statement that are combined using a question mark (?) and a colon
(:):
• ((condition) ? trueStatement : falseStatement)
• The way it works is that the condition is evaluated. If it is true, then
the true statement executed; if it is false, then the false statement
executes
• Before Elvis we had isDefined(), structKeyExists() and IF statements to
do these kind of evaluations.
35. Elvis Operator
• Syntax: ?:
value = ( url.foo ?: "bar" );
• The Elvis operator is primarily used to assign the ‘right default’ for a
variable or an expression
• Or it is a short-hand way to do parameterization. It will allow us to set
a value if the variable is Null
36. Elvis Operator
Examples which are all the same:
1. If ( isNull(local.testVar)){
value = “test Item”;
} else{
value = local.newTest;
}
2. Value = (local.testVar ?: “test Item”);
3. Value = (isNull(local.testVar) ? “test Item”: local.newTest);
37. Elvis Operator
result = firstOperand ?: secondOperand; // binary
result= (local.myVar ?: “default value”);
OR
result = firstOperand ?: secondOperand; // binary
result = isInteger(17) ? "it's an integer" : "no it isn't"; // "it's an integer"
OR
result = firstOperand ? secondOperand : thirdOperand; // ternary
result = isInteger("nineteen") ? "it's an integer" : "no it isn't"; // "no it isn't“
38. Elvis Operator
• Resources:
• Wiki docs https://helpx.adobe.com/coldfusion/developing-applications/the-cfml-programming-
language/elements-of-cfml/elvis-operator.html
39. Closures
• A Closure is a function which binds variable references at declaration
time not at use-time
• Callbacks are not Closures (inline callbacks are)
• That inner function has access to the var scope of the function it was
defined from. This is what a closure is. It knows about its origin and it
doesn't forget. It will always be tied to that same parent var scope.
40. Closures
javascript example (works in CF also)
Function outerFunction() {
var a = 3;
return function innerFunction(b){
var c = a + b;
return c;
}
}
(1) var foo = outerFunction()
(2) var result = foo(2);
(3) Console.log(result); //5
• We have an outer function with a
nested function which accepts a
parameter b
• (1)When you invoke the outer you
get the inner returned later.
• (2)Notice the outer function was
called but the a still has its value
and is used in the return function
(innerFunction).
• (3)That is why the result Is 5!
• http://taha-sh.com/blog/understanding-
closures-in-javascript
41. Closures
function bunchofstuff(…) { // OLD CODE
…bunch of stuff…
}
function restofstuff(…) { …rest of stuff… }
function stuff1(…) { bunchofstuff(…); …more
stuff… restofstuff(…); }
function stuff2(…) { bunchofstuff(…); …other
stuff… restofstuff(…); }
You still have 4 functions and stuff1 and 2
still have common code
function generalstuff(…, differentstuff) { // CLOSURE WAY
…bunch of stuff… differentstuff(…); …general code…
}
function stuff1(…) {
generalstuff(…, function(…){ …more specific stuff…
});
}
function stuff2(…) {
generalstuff(…, function(…){ …more specific stuff… });
}
Using the closure code above all common code is in general
stuff and…
you call stuff1 or stuff 2 for the specific code you need run
(Template Method design pattern)
42. Closures
ColdFusion Docs Example:
function helloTranslator(String helloWord) {
return function(String name) {
return "#helloWord#, #name#";
};
}
helloInHindi=helloTranslator("Namaste");
helloInFrench=helloTranslator("Bonjour");
writeoutput(helloInHindi("Anna"));
Namaste, Anna
writeoutput(helloInFrench("John"));
Bonjour, John
• In this case, using closure, two new functions are
created. One adds Namaste to the name. And the
second one adds Bonjour to the name.
• helloInHindi and helloInFrench are closures. They
have the same function body; however, store
different environments.
• The inner function is available for execution after
the outer function is returned. The outer function
returns the closure
• A closure is formed when the inner function is
available for execution. Meaning, it is formed when
it is defined, not when it is used.
43. Closures
• Ray Camden example (technically is, but more like a callback/inline function) :
Data = [“Neil Diamond”, “Depeche Mode”, “The Cure”, “Cher”, “Ace of Base”, “Frank
Sinatra”, The Church”];
arraySort(data, function(a,b){
var first = a;
var second = b;
first = replace(first, “The “, “”);
second = replace(second, “The “, “”);
return first gt second;
});
This code above will order the data array by names excluding THE.
Ace of Base, Cher, The Church, The Cure, Depeche Mode, Frank Sinatra, Neil Diamond
44. Closures
ColdFusion built in Functions that use Closures:
• CF10 Closure Functions:
• ArrayEach, StructEach
• ArrayFilter, StructFilter,ListFilter
• ArrayFindAt, ArrayFindAllNoCase
• CF11 Closure Functions:
• isClosure
• ArrayReduce, StructReduce, ListReduce
• ArrayMap, StructMap, ListMap
51. Closures
Testbox: https://www.ortussolutions.com/product/testbox
• TestBox uses Closures
• Since the implementations of the describe()
and it() functions are closures, they can
contain executable code that is necessary to
implement the test. All ColdFusion rules of
scoping apply to closures, so please
remember them. We recommend always
using the variables scope for easy access and
distinction.
• A test suite begins with a call to our TestBox
describe() function with at least two
arguments: a title and a closure within the
life-cycle method called run(). The title is the
name of the suite to register and the function
is the block of code that implements the
suite.
function run() {
describe("A suite is a closure",
function() {
c = new Calculator();
it("and so is a spec", function() {
expect( c ).toBeTypeOf( 'component' );
});
});
}
52. Closures
• Some Example code online or resources:
• Sesame library inline functions/closures
https://github.com/markmandel/Sesame
• Underscore.cfc ported from underscore.js
https://github.com/russplaysguitar/UnderscoreCF
• TestBox gives the ability to use closures
http://wiki.coldbox.org/wiki/TestBox.cfm
• Adam Tuttle presentation on closures
http://fusiongrokker.com/p/closures/#/
• Adam Cameron blog multiple Closure examples
http://blog.adamcameron.me/search/label/Closure
53. Map and Reduce (and more)
• The map() functions iterate over the collection (be it a list, array or struct),
and returns a new object with an element for each of the ones in the
original collection. The callback returns the new element for the new
collection, which is derived from the original collection. It is important to
note that only the collections values are changed, it will still have the same
key/indexes.
• So it remaps the original collection
• ArrayMap, StructMap, ListMap
• The reduce() operation is slightly more complex. Basically it iterates over
the collection and from each element of the collection, derives one single
value as a result.
• ArrayReduce, StructReduce, ListReduce
54. Map and Reduce (and more)
• The Filter() function is similar to
map and reduce. It will iterate over
a given object and return a new
object but the original list is
unaffected. The callback returns a
Boolean to determine if the
element is returned in a new
object.
structEach(circles,function(key,value)
{
matchednames =
arrayfilter(value,function(obj)
{
return left(obj,1)=='d';
}
});
Example shows how to look at a struct
and if it begins with a D, return it.
55. Map and Reduce (and more)
• The each() function iterates over
a given object and calls a
callback for each element. This
can be used instead of a loop.
letters = ["a","b","c","d"];
arrayEach(letters, function()
{
writeDump(arguments);
});
Struct 1 a
struct 1 b
struct 1 c
struct 1 d
58. Map and Reduce (and more)
• ArrayMap Example ( next few examples from Adam Cameron):
rainbow = ["Whero","Karaka","Kowhai","Kakariki","Kikorangi","Tawatawa","Mawhero"];
colourInList = arrayMap(
rainbow, function(v,i,a){
return replace(a.toList(), v, ucase(v) );
}
);
writeDump([rainbow,colourInList]);
Will see an array of Rainbow with 7 items each showing the next in the row all caps:
WHERO,Karaka,Kowhai,Kakariki,Kikorangi,Tawatawa,Mawhero
whero,KARAKA,Kowhai,Kakariki,Kikorangi,Tawatawa,Mawhero
whero,karaka,KOWHAI,Kakariki,Kikorangi,Tawatawa,Mawhero
59. Map and Reduce (and more)
• StructMap()
original = {"one"={1="tahi"},"two"={2="rua"},"three"={3="toru"},"four"={4="wha"}};
fixed = structMap(original, function(k,v)
{
return v[v.keyList().first()];
});
writeDump([ original, fixed]);
This just returns the digit as a key and Maori number as a value
1 tahi
2 rua
3 toru
4 wha
60. Map and Reduce (and more)
• listMap()
Rainbow = "Whero, Karaka, Kowhai, Kakariki, Kikorangi, Tawatawa, Mawhero";
externalList = "";
reverseRainbow = listMap( rainbow, function(v,i,l)
{
var newValue = "#i#:#v.reverse()#";
externalList = externalList.append(newValue);
return newValue;
});
writeDump([{rainbow=rainbow},{reverseRainbow=reverseRainbow},{externalList=externalList}]);
This should reverse the rainbow list and show it backwards.
61. Map and Reduce (and more)
• listReduce()
numbers = "1,2,3,4,5,6,7,8,9,10";
sum = listReduce(numbers, function(previousValue, value)
{
return previousValue + value;
}, 0);
writeOutput("The sum of the digits #numbers# is #sum#<br>");
The sum of the digits 1,2,3,4,5,6,7,8,9,10 is 55
62. Map and Reduce (and more)
• arrayReduce()
rainbow =
["Whero","Karaka","Kowhai","Kakariki","Kikorangi","Tawatawa","Mawhero"]
;
ul = arrayReduce(rainbow, function(previousValue, value)
{
return previousValue & "<li>#value#</li>";
}, "<ul>"
) & "</ul>";
writeOutput(ul);
Result is just the Array turned into a list
63. Map and Reduce (and more)
• structReduce()
• StructReduce(struct, function(result, key, value [,struct]), initialVal)
rainbow = { "Red"="Whero", "Orange"="Karaka", "Yellow"="Kowhai", "Green"="Kakariki” };
ui = structReduce( rainbow, function(previousValue, key, value)
{
return previousValue & "<dt>#key#</dt><dd>#value#</dd>";
},
"<dl>"
) & "</dl>";
writeOutput(dl);
Result is a two column list of the key and the value: Blue Kikorangi
64. Map and Reduce (and more)
• Resources
• map and reduce & more with adam: http://blog.adamcameron.me/2014/02/coldfusion-11-map-and-reduce.html
• map reduce: https://hacks.mozilla.org/2015/01/from-mapreduce-to-javascript-functional-programming/
• js working example of each: http://elijahmanor.com/reducing-filter-and-map-down-to-reduce/
65. First Class Functions
• A first class object is the one which could be passed as an argument
• Now you can treat ColdFusion functions such as arrayLen, lCase,
uCase, etc. as objects and you can do the following:
• Pass them as arguments to a function call
• Assign them to variables
• Return them as a result of a function invocation
• This first introduced in ColdFusion 11
66. First Class Functions
• What is a Callback function?
• This is a function that is passed
into another function.
• You build a main generic function
to do work, then you can pass in a
more detailed function to do a lot
of the work.
• Sorting, you might want to sort
money data, or state data, or city
data
• Build a sort function then pass in
the callback function you need to do
your sort
Sort(dataToSort, callBackFunction)
{ //do stuff }
callbackFunction()
{ //build sort }
Calls the Sort function:
sortedData = sort(unsortedData,
callbackFunction);
67. First Class Functions
Here is how to pass in a built-in function as an argument:
Function convertCaseArray(Array, array, function converter){
for (var i=1, I <= arrayLen(array); i++){
array[i] = converter(array[i]);
}
return array;
}
resultArray = convertCaseArray([‘One’,’Two’,’Three’], lcase);
Writedump(resultArray);
Array converted to all lower case
68. First Class Functions
This is where lcase and ucase are being returned from a function:
Function convertArray(array array, string caseTo){
caseConvertFunction = getConvertFunction(caseTo);
for (var i=1, I <= arrayLen(array); i++){
array[i] = caseConverterFunction{array[i]);
}}
Function getConvertFunction (String caseType){
if (caseType == ‘lower’) return lcase; else return ucase;
}
resultArray_lower = convertArray([‘One’, ‘Two’, ‘Three’], ‘lower’);
resultArray_upper = convertArray([‘One’, ‘Two’, ‘Three’], ‘upper’);
_lower array: one, two, three
_upper array: ONE, TWO, THREE
70. ColdFusion 12 feature
• NDA – What I will show here may not be talked about until Adobe
allows the discussion to be public.
• ColdFusion 12 has the code name of RAIJIN
71. ColdFusion 12 Feature
• Save Navigation -- ?.
• Save navigation operator can be used to access members of a struct or values
of an object.
• Normally we use a .
• <cfset t = myObject.getUserObj />
• Now we can use the ?. To ensure that an exception is not thrown when the
variable is not defined
• <cfset t = myObject?.getUserObj />
• If myObject is not defined then t will be assigned as undefined
72. ColdFusion 12 Feature
Old way:
if(isDefined("foo"))
writeOutput(foo.bar());
else
writeOutput("not defined");
New way:
writeOutput(foo?.bar());
Chaining:
writeOutput(employee?.name?.firstname?.trim());
The above code does not output any value if any of
the following is undefined/null:
employee OR
employee.name OR
employee.name.firstname.
Note: the code will throw an exception if the
employee is defined but employee.name is not
73. ColdFusion 12 Feature
• There are a few other new Language enhancements not discussed
today
• There are new enhancements to current features of ColdFusion
• There is also a few new features that will be announced soon
Resources:
Adam Cameron Blog: http://blog.adamcameron.me/2015/10/coldfusion-12-it-
goes-to-show-you.html
74. Final Thoughts/Resources
• These topics were only some more modern concepts for CFML.
• Where to get more information from CFML Community
• Adobe Wiki
• CFDocs.org
• Cfblogger (put in aggregator like feedly)
• Slack Channel – 700+ cfml users https://cfml.slack.com/
• Twitter, Facebook, youTube, Vimeo and other social sites
Dan Fredericks
@fmdano74
fmdano@gmail.com
I am on most social networks, twitter, facebook, G+, LinkedIn
Special Thanks to Adam Cameron, Adam Tuttle, Ray Camden, Sean Corfield, and Brad Wood for examples