Modernize or Die® - CFML News for June 23rd, 2020
Gavin and Eric host this weeks episode. They discuss ColdBox's 14th Birthday. They discuss an Ortus Webinar being hosted by Gavin on Friday called Modern Functional & Fluent CFML REST APIs. They discuss The ColdFusion Meetup Online, with an upcoming session by Charlie Arehart and provide links to the last 2 presentations... and remind you to take the State of the CF Union survey from TeraTech.com. They discuss a change in the date in one of the Into the Box workshops, ColdBox Hero to SuperHero lead by Luis Majano, and announce the next workshop will be a repeat of the ColdBox Zero to Hero in early July, dates to be confirmed. They spotlight a lot of great blog posts, tweets, videos and podcasts, too many to list, so listen to the show. They announce some jobs from twitter and getCfmlJobs.com and from the web. They show off the ForgeBox module of the Week, Lucee Performance Analyzer - Lucee Extension by Zac Spitzer, a Performance Analyzer plugin for Lucee, to be used in the Lucee admin. This week's VS Code Tip of the week is Advanced New File, Inspired by Sublime's AdvancedNewFile plugin, this adds the ability to create files anywhere in your workspace. For the show notes - visit the website https://cfmlnews.modernizeordie.io/episodes/modernize-or-die-cfml-news-for-june-23rd-2020 Music from this podcast used under Royalty Free license from SoundDotCom https://www.soundotcom.com/ and BlueTreeAudio https://bluetreeaudio.com
Watch the video version on YouTube at: https://youtu.be/QsPE90ZDZ3w
Gavin Pickin - Software Consultant for Ortus Solutions
Eric Peterson - Software Consultant for Ortus Solutions
Thanks to our Sponsor - Ortus Solutions
Get live training from the makers of your favorite Box Product.
Live Virtual Workshops available for signup in June and more to be announced soon.
CFCasts.com is up and running with all of the Into the Box 2020 Videos.
We are at the 48% mark for fully funding all of our Modernize or Die Podcasts via our Patreon site: https://www.patreon.com/ortussolutions . If you love our podcasts and all we do for the #coldfusion #cfml community considers chipping in, we are almost there!
News and Events
Happy Birthday ColdBox - 14 years Old
Ortus Webinar - Modern Functional & Fluent CFML REST APIs
Presented by: Gavin Pickin
Friday June 26th, at 9am PDT or 11am CDT
DRY Programming can be more fun than you think, in this session we'll show you how a few helper methods can give you a functional, fluent, stylish and clean way to write code for your REST API. Not writing an API, this can help traditional Applications too.
Registration Link: https://us02web.zoom.us/meeting/register/tZ0qceuoqjMiGtVP0Bj9Uvya5hCV6yX1pzm-
Webinars page: https://www.ortussolutions.com/events/webinars
ColdFusion Meetup - "Keeping CF (and Java) updated: challenges and solutions", with Charlie Arehart
Thursday June 25 at 12pm US Eastern Time, UTC-4.
Are you keeping up on whatever updates are available for the CF version you're running (2018, 2016, or so on)? And how about updating the Java/JVM that CF uses? You should be, for security as well as bug fix reasons. And what about the web server connector (wsconfig)?
Meeting URL: https://experts.adobeconnect.com/cfmeetup/
ICYMI: ColdFusion Meetup - "How to transform DB tuning into a rewarding effort", with Josh Patterson
Presented on June 18th
Poor database performance can cost you customers, and when it’s happening that’s not the best time to be making decisions about how to monitor and tune things. Better to consider options in advance, and even proactively tune things if possible. Tuning might also allow you to reduce overly-scaled out instances, reducing DB licensing and/or server costs.
ICYMI: ColdFusion Meetup - "Low-Code for the ColdFusion Developer – What is it, and Why you should care" with G. Andrew Duthie
ColdFusion developers know what it means to be productive. Delivering data-driven websites and solutions is familiar territory. But whether you’re an employee in the enterprise, or a contractor seeking out your next gig, you may start hearing about Low-Code, if you haven’t already. Maybe your company has decided to try it out, or maybe it’s just something a customer asked about, but if you listen to the analysts, Low-Code is a growing segment of the IT market, and a market shaping up to be in the tens of billions of dollars.
Reminder: State of the CF Union 2020 Survey
VOTE FOR OUR PODCASTS
Help us find out the state of the CF Union – what versions of CFML Engine do people use, what frameworks, tools etc. We will share the summary results with everyone who completes the survey so that you can see how you compare with other CF developers.
Most questions are multiple choice checkboxes that are fast to answer. Thanks for your time completing this survey!
Partial Results: https://teratech.com/state-of-the-CF-Union-2020-partial-Results
Into the Box 2020 - Workshops - Virtual Live training
Luis leading ColdBox Hero to Superhero July 23-24 - DATE CHANGED
2 x 6 hour days
1 hour lunch
1pm to 4pm central
Tickets available: $899
PODCAST10 - 10% off
There is a code for ITB attendees to save 15% - If you didn’t get the email contact us.
ColdBox Zero to Hero - Coming in July - date to be confirmed shortly - Possibly July 9/10
CF Summit West
More conferences: https://confs.tech/
Blogs, Tweets and Videos of the Week
Blog - Ben Nadel - Scope Traversal Behavior With Undefined Function Arguments In Lucee CFML 126.96.36.199
Just now, as I was looking at iterating over Structs using CFLoop in Lucee CFML, I ran into a fun little behavior of the ColdFusion language: Scope traversal will skip-over undefined function arguments and access like-named values in higher-up scopes. At first, this feels like a bug. But, I think it ends-up being consistent with how ColdFusion has always handled scope traversal. That said, as a mental refresher, I thought it would be worth exploring this use-case in Lucee CFML 188.8.131.52.
Blog - Ben Nadel - Struct Iteration With CFLoop Exposes Both Key And Value In Lucee CFML 184.108.40.206
Back in February, when I was having lunch with Gert Franz, co-creator of Lucee CFML, we were commiserating on how amazing ColdFusion is. At that lunch, Gert told me about some of the great things that Lucee CFML offers, like its seamless support for ColdFusion Tags in CFScript. Another minor feature that he mentioned was that the CFLoop tag exposes both Key and Value attribute that remove the need to look-up the value within the CFLoop body. Now, months later, I finally used this feature for the first time in yesterday's post on proxying Amazon S3 uploads using CFHTTP and Lucee CFML. Given the fact that Adobe ColdFusion doesn't support this feature, I thought it might be worth exploring in Lucee CFML 220.127.116.11 in case new Lucee-converts didn't realize it was there (just as I didn't).
Blog - Brain Klaas - Beyond the Basics of Using AWS S3 in CFML: Use Lifecycle Rules to Automatically Delete Files After a Period of Time
In the last post in this series, we looked at Lifecycle Rules in S3, how they worked, and how you can use them to save money by automatically moving less-frequently used files to different (and cheaper) storage classes. There’s another powerful aspect to Lifecycle Rules that can save you money: automatically deleting files after a specified period of time.
Many of the files that are added to S3 buckets are never used after a brief, initial period of time. Many companies put all of their log files in S3. Are those log files valuable after data analysis is complete? Are the storage costs worth the price after 180 days? After 365? Are there regulatory or compliance reasons to not store user-generated data for a long period of time?
Blog - Ben Nadel - Proxying Amazon AWS S3 Pre-Signed-URL Uploads Using CFHTTP And Lucee CFML 18.104.22.168
At InVision, when a user goes to upload a screen for an interactive prototype, we have the browser upload the file directly to S3 using a pre-signed URL. We've been using this technique for years and it's worked perfectly well. However, we now have an Enterprise client whose network is blocking all calls to Amazon AWS. As such, they are unable to use pre-signed URLs for their file uploads. To try and get around this issue, I wanted to see what it would take to proxy uploads to Amazon AWS S3 through our application using the CFHTTP tag and Lucee CFML 22.214.171.124.
Live Stream - Matthew Clemente - Building a Node.js CLI Utility: Command Line Arguments (Learning by Trial and Error)
After getting started building a Node.js CLI utility last week, I decided I wanted to take a closer look presenting/parsing command line arguments. This is the core point of interaction with the user, so it needs to be done well. There are a number of libraries for this, so I'll take a look at what they have to offer.
I'll be honest, I've been spoiled by CommandBox's batteries-included approach #CFML
Blog - Ben Nadel - Returning CFQuery / Query Results As Structs In Lucee 126.96.36.199
A few months ago, I looked at returning CFQuery results as an Array in Lucee CFML; and, in the comments of that post, Gert Franz pointed out that Lucee could also return CFQuery results as a Struct in which a given column would be used as the look-up key in said Struct. Mapping a query onto a Struct is actually a technique that I use a lot in my ColdFusion code, typically with some sort of .indexBy() or .groupBy() User-Defined Function (UDF). As such, I wanted to take a moment and look at how I might replace my custom functions with this built-in query feature in Lucee CFML 188.8.131.52.
Blog - Ben Nadel - Every Line Of Code That You Write Is An Explicit Decision To Make The Application Better Or Worse
Blog - Ben Nadel - Using UPDATE + ORDER BY + LIMIT To Drive Multi-Worker Migrations In Lucee CFML 184.108.40.206
Earlier this week, I took a look at using ORDER BY and LIMIT clauses within an UPDATE statement in MySQL 5.6.37 in order to limit the scope of the data-mutation. In that post, I said that such a technique can be used to drive a multi-worker / multi-threaded migration in which each worker "claims" and then "processes" a subset of records within a "task table". Since I find this technique to be relatively simple but also wickedly useful, I thought it would be fun to put together a migration demo in Lucee CFML 220.127.116.11.
Blog - Brian Klaas - Beyond the Basics of Using AWS S3 in CFML: Use Lifecycle Rules to Move Files Into Different Storage Classes
In my last post in this series, we looked at using different storage classes in S3 via CFML to save money on long-term storage costs. The use case for that blog post assumed you knew the utilization pattern for the files you uploaded. They would either be very busy files, files that were accessed occasionally, or files that were accessed rarely. What happens, though, when file acess moves over time from frequently access to only occasional access? Wouldn’t it be nice if S3 would automatically move those files from a more expensive storage class with the fastest response time to a storage class where response times were a few miliseconds longer, but cost half the price?
S3 provides lifecycle rules to do exactly that.
Blog - Fusion Reactor - Why is Technical Debt Becoming Increasingly Important
In simple terms, technical debt is what occurs when bugs or issues aren’t resolved in the earlier stages of development.
Let’s assume you intend to start a new development project, and everything is going as planned; code is coming in, art is crafted, and the content design is moving accordingly. However, just as soon as you think you have everything figured out, all hell breaks loose in the form of technical debt.
Blog - Ben Nadel - You Can Use ORDER BY And LIMIT Within UPDATE And DELETE Statements In MySQL 5.6.37
Continuing with the database-theme of the week, I wanted to share one piece of wisdom that I learned from our former director of Data, Brad Brewer. He taught me that you can use the ORDER BY and LIMIT clauses inside both UPDATE and DELETE SQL statements within MySQL 5.6. While I wouldn't use this technique in my day-to-day CRUD (Create, Read, Update, Delete) code, I do use these options religiously when I am writing data clean-up and migration scripts (ie, those SQL scripts that you run outside of the main application).
Blog - Ben Nadel - Why I Use TINYINT Columns Instead Of BIT Columns For Boolean Data In A MySQL Application
Since the theme of my week appears to be database interactions (having looked at index structure query-performance on "membership" tables and prepared statements in the JDBC driver), I figured I would end the week on more database-related "hot take": I no longer use BIT columns to store "Boolean" data in MySQL. Instead, I use a TINYINT column.
CAUTION: There is no "right" answer on this topic - this is just my opinion based on my experience and the choices that have come back to haunt me / make my database interactions more challenging.
Blog - TeraTech - Adobe ColdFusion Security Best Practices (Server Auto-Lockdown)
Most security features and protocols focus on prevention. Firewalls, security analyzers, and proper coding all keep hackers away. And sometimes, unfortunately, security breaches still occur.
Blog - Ben Nadel - I've Had Fundamental Misunderstandings Of How CFQueryParam Works Within MySQL Queries And ColdFusion / Lucee CFML
As much as I love databases and writing SQL, the reality is, I'm not a "database admin". And, I don't have the best grasp of how databases work their magic under the hood. This leaves me open to many misunderstandings; one of which appears to be the way that the CFQuery and CFQueryParam tags work with the MySQL JDBC Driver (MySQL Connector/J 5.1) when used in ColdFusion / CFML. I believe that my understanding of the caching and performance benefits have been way off-base.
Live stream - Matthew Clemente - Getting Started Building a CLI Tool with Node.js (Learning by Trial and Error)
I've built some CLI tools with CFML, but never with Node.js. So, I"ll be working my way through some tutorials, trying to put together my first Node.js command line utility. Not sure how far I'll get, but I've got to start somewhere.
Blog - Fusion Reactor - Sending Custom Metrics to FusionReactor Cloud
Recently we were asked if we had specific integration for openmetrics to send information to FusionReactor Cloud. While we don’t have support for openmetrics specifically we do have an API where any metrics can be posted from the FusionReactor instance.
There 2 stages to getting this working. Firstly you need to use FRAPI to post a metric every second / minute for your custom series and the second part is configuring the cloud graph profile to show this data.
Tweet - Codewars now supports 7 new languages - Including CFML
@codewars now supports 7 new niche languages and communities including @coldfusion, @racketlang, #Coq, #VisualBasic, #Forth, factorcode.org, and @SWI_Prolog. Train your skills in these languages at codewars.com! #ColdFusion #code #softwaredevelopment
Tweet - Dan Fredericks - CodeGrepper
looking into this, but might be an extension people would like…
Angie Jones @techgirl1908
I added the @CodeGrepper chrome extension a few days ago and am loving it!
When you search for something coding-related, it shows a code snippet for what you want right at the top of the search results. It's been such a time saver for me.
Several positions available on https://www.getcfmljobs.com/
Listing over 44 ColdFusion positions from 33 companies across 23 locations in 5 Countries
5 new jobs this week.
Full-Time - Senior Developer - Coldfusion - Hyderabad at Hyderabad, Tela.. - India
Posted Jun 18
Full-Time - ColdFusion Developer at Downers Grove, IL - United States
Posted Jun 18
Full-Time - ColdFusion | AngularJS Developer at Memphis, TN - United States
Posted Jun 16
Full-Time - ColdFusion Developer at Austin, TX - United States
Posted Jun 11
Full-Time - ColdFusion programmer at Washington, DC - United States
Posted Jun 10
ForgeBox Module of the Week
Lucee Performance Analyzer - Lucee Extension by Zac Spitzer
Performance Analyzer plugin for Lucee, to be used in the Lucee admin.
Install via Applications page in your Lucee Administrator. It's best to install under the Web Administrator, once this bug/patch against Lucee is merged, you will be able to install the plugin once at the Server level and then access the plugin from all web contexts.
You will need to enable debugging and configure a debug template in order to capture debug logs for this plugin to work.
Summary of top variable Scoping problems
Summary of slowest sql queries
VS Code Hint Tips and Tricks of the Week
Advanced New File
Inspired by Sublime's AdvancedNewFile plugin, this adds the ability to create files anywhere in your workspace.
- Fuzzy-matching autocomplete to create new file relative to existing path (thanks to JoeNg93 for making it faster)
- Create new directories while creating a new file
- Create a directory instead of a file by suffixing the file path with / as in somedirectory/ to create the directory (thanks to maximilianschmitt)
- Ignores gitignored and workspace files.exclude settings.
- Additional option of adding advancedNewFile.exclude settings to workspace settings just like native files.exlude except it explicitly effects - - - AdvancedNewFile plugin only. (thanks to Kaffiend)
- Control the order of top convenient options ("last selection", "current file", etc) via config setting advancedNewFile.convenienceOptions
Thank you to all of our Patreon Supporters
These individuals are personally supporting our open source initiatives to ensure the great toolings like CommandBox, ForgeBox, ColdBox, ContentBox, TestBox and all the other boxes keep getting the continuous development they need, and funds the cloud infrastructure at our community relies on like ForgeBox for our Package Management with CommandBox.
You can support us on Patreon here https://www.patreon.com/ortussolutions
Carl Von Stetten
You can see an up to date list of all sponsors on Ortus Solutions' Website
Switch to Modernize or Die ® Podcast - SoapBox Edition - Switch to Modernize or Die ® Podcast - Conference Edition
Music from this podcast used under Royalty Free license from SoundDotCom and BlueTreeAudio© 2019 Ortus Solutions