tag:blogger.com,1999:blog-59811148906399018112024-03-14T09:22:11.040+00:00Chaos Reigns WithinRandom adventures in Data AnalyticsAdam Rileyhttp://www.blogger.com/profile/02560079966812151991noreply@blogger.comBlogger92125tag:blogger.com,1999:blog-5981114890639901811.post-45070012094859161142023-12-11T07:00:00.001+00:002023-12-31T17:14:04.463+00:00Advent Of Code and Alteryx<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ0IKLQPIkt7QQ2db2CHIrw9hZ_x8XkQ-we14gT4V2bgM6klj5X3cNr62NOWTIG45FHJwbJMqo11RilxyN-Ezw2hore7C7CtiSdCuU-Sm9oVGqLVwNiRWqfQfAxInbgp3ZLiYJHauyyX0bnyDC2aKyLBO-JqaBoOp72p09dXhkK4Cwa75FqVSLWN_nP2k/s1280/aoc0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="682" data-original-width="1280" height="341" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ0IKLQPIkt7QQ2db2CHIrw9hZ_x8XkQ-we14gT4V2bgM6klj5X3cNr62NOWTIG45FHJwbJMqo11RilxyN-Ezw2hore7C7CtiSdCuU-Sm9oVGqLVwNiRWqfQfAxInbgp3ZLiYJHauyyX0bnyDC2aKyLBO-JqaBoOp72p09dXhkK4Cwa75FqVSLWN_nP2k/w640-h341/aoc0.jpg" width="640" /></a></div><br /><div style="text-align: center;"> <span style="background-color: white; color: rgba(0, 0, 0, 0.6); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 12px; text-align: center;">Image generated with the assistance of AI [1]</span></div><p></p><p>It is now just over 5 years since I tweeted the below on X (Twitter):</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifgpGuByvF2v8jHZ8gpWtX07uoh_6-Jf92WI-of9M-j0qpDASPTlbZQyP-tpkmrJ89riEblWEjnUUiOKBaEw_YNN5Up-fNqDpFVO-9k9NMaV2PYs9Ds3ec8NqRmYWEVaCykXPsMqNY_R4I221Vhj4y4GlamyBv1wu4tZeBeW6LLXT6pN9fx8qhVuDJEDw/s743/aoc1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="162" data-original-width="743" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifgpGuByvF2v8jHZ8gpWtX07uoh_6-Jf92WI-of9M-j0qpDASPTlbZQyP-tpkmrJ89riEblWEjnUUiOKBaEw_YNN5Up-fNqDpFVO-9k9NMaV2PYs9Ds3ec8NqRmYWEVaCykXPsMqNY_R4I221Vhj4y4GlamyBv1wu4tZeBeW6LLXT6pN9fx8qhVuDJEDw/w640-h140/aoc1.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div>and, pulling that tweet up to write this post, I realise I actually got very little engagement. But fast forward 5 years and at the time of writing (Day 9) over 100 people have solved at least one of this year's problems using Alteryx; there is a very active WhatsApp group (that I struggle to keep up to date with!) and you can get a shiny Advent Of Code badge on the Alteryx community!<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKShEdwdQUcsUQ5ht8Gpw-wlhIlYUT06s1d7bnEJeADU1vYgW1sSA4dTwquK1RnPCnDbJqvsryrrSNuPxzOSRzdsNsmYnK-svege-qEgJMh00FC19vyjs1fRjm5WD-iKFXsCPWaLiMZ0npBXeE2an7o8irnt4mt0IUUuSgAJSvkgzg5OzNHbFtL_eQgpA/s185/aoc2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="185" data-original-width="185" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKShEdwdQUcsUQ5ht8Gpw-wlhIlYUT06s1d7bnEJeADU1vYgW1sSA4dTwquK1RnPCnDbJqvsryrrSNuPxzOSRzdsNsmYnK-svege-qEgJMh00FC19vyjs1fRjm5WD-iKFXsCPWaLiMZ0npBXeE2an7o8irnt4mt0IUUuSgAJSvkgzg5OzNHbFtL_eQgpA/w320-h320/aoc2.png" width="320" /></a></div><p style="text-align: center;">Image from Alteryx community [2]</p><h2 style="text-align: left;">What is the Advent Of Code?</h2><p>But what is this Advent Of Code (AoC)? And why do we care that people are solving it in Alteryx?</p><p><a href="https://adventofcode.com/" target="_blank">Advent Of Code</a> was created by Eric Wastl in 2015[3] and is "an annual set of Christmas-themed computer programming challenges that follow an Advent calendar."[4] So not particularly data problems or designed to be solved by Alteryx, people solve them in all sorts of computer languages. Over the years I have solved them in many languages including Python, R, Scala and Rust. For myself as a software engineer I find it an interesting way of playing with a new language, learning its capabilities, strengths and weaknesses. And also as a way of seeing how other people write code.</p><p>So why solve them in Alteryx? Well the simplest answer is why not? Doing strange things with Alteryx has been something I have enjoyed doing for many years. </p><p>The second answer is because I can :) (Sometimes...) What I noticed back in 2018, and has held true since, is that Alteryx is very good at solving the early days of the AoC challenges. And this is in many ways due to how Eric designed the puzzles: the input to every problem is always a single text file and the answer (or output) is always a single integer. (Well two integers, as each day has two parts.) So however complex the puzzle, all of the input is always contained in a single text file, that has to be parsed into its parts, before you move on to solving the actual puzzle. And if there is one thing that Alteryx can do very well, it is parsing text files!</p><p>Where things become interesting is as the problems get more complex, we begin to run into the limits of Alteryx as a programming language. Which leads me to my next interesting question:</p><h2 style="text-align: left;">Is Alteryx A Programming Language?</h2><p>This is an interesting question. It is certainly not marketed as a programming language. Typically we think of a programming language being made up of code and Alteryx is talked about as being "code free".</p><p>But in reality: yes, Alteryx is a programming language.</p><p>As the user drags and drops tools on to the canvas they are building up an xml document that represents the data transformation that they have defined. That xml (or code) is then executed by the Alteryx engine.</p><p>If we are going to be more specific we can say that Alteryx is a "Visual Programming Language" and it is a "Domain Specific Language". The domain in question being data analytics. And it is this domain which brings certain limits to the language which makes some of the Advent Of Code problems more challenging...</p><h2 style="text-align: left;">But Isn't Alteryx Turing Complete?</h2><p>Well yes. I think it was Steve Ahlgren who famously stated that Alteryx was Turing complete if you used a rock to hold down the run button. But being Turing complete isn't actually that interesting for real world applications. My 10 year old daughter with a pen and a pad of paper is Turing complete. As is Excel [5]. As is "Magic: the Gathering" [6]. But none of those are going to be particularly good for writing arbitrary computer programs in. Turing completeness is a useful concept when we are looking at the theory of what computer algorithms can or can not do. It is not a great measure for what they can practically do with a reasonable amount of computing power and time.</p><h2 style="text-align: left;">Where are the limits of the Alteryx language?</h2><p>I think there are two major limitations that you run into in trying to solve Advent Of Code problems in Alteryx: Types and Loops.</p><p>(Please add in the comments if you can think of more.)</p><h3 style="text-align: left;">Types</h3><p>The only data type in the top level Alteryx language is the data table. This makes a lot of sense given our previous statement that is a Domain Specific Language for manipulating data, but does limit its capabilities when trying to use it as a more general purpose language. Of course within the data table there is a rich type system and usually you can work within the table to represent the data variables you need.</p><h3 style="text-align: left;">Loops</h3><p>I think this is the big one, and usually the point where I give up on AoC in Alteryx for the year. Alteryx does have the concept of loops in the form of batch macros (loosely equivalent to a FOR loop) and iterative macros (loosely equivalent to a DO WHILE loop), but these can be difficult to configure (especially if you have some complex data variables you are manipulating in tables. But more of a problem on the practicality front they can take a long time to execute. I have built AoC solutions that have taken over 24 hours to execute. Generate rows can be a good way to avoid a macro solution and simulate a loop, but can sometimes bring different data size issues.</p><h2 style="text-align: left;">Conclusion</h2><p>Day 9 is usually about as far as I get with Advent Of Code and Alteryx, before the busy-ness of family life and December overtakes life. (And having departed Alteryx last week, my trial Alteryx license will soon run out). So next year I will be completing AoC in a different language.</p><p>Good luck to everyone still playing!</p><p>Merry Christmas and a Happy New Year</p><p>Adam</p><h4 style="text-align: left;">References:</h4><p>[1] Image Creator from Microsoft Designer (<a href="http://bing.com">bing.com</a>)</p><p>[2] Advent of Code 2023 (2023). <a href="https://community.alteryx.com/t5/Alter-Nation/Advent-of-Code-2023/ba-p/1211440">https://community.alteryx.com/t5/Alter-Nation/Advent-of-Code-2023/ba-p/1211440</a>.</p><p>[3] Advent of Code 2023 (2023). <a href="https://adventofcode.com/">https://adventofcode.com/</a>.</p><p>[4] Wikipedia contributors (2023) Advent of Code. <a href="https://en.wikipedia.org/wiki/Advent_of_Code">https://en.wikipedia.org/wiki/Advent_of_Code</a>.</p><p>[5] Couriol, B. (2021) 'The Excel Formula language is now Turing-Complete,' InfoQ, 2 August. <a href="https://www.infoq.com/articles/excel-lambda-turing-complete/">https://www.infoq.com/articles/excel-lambda-turing-complete/</a>.</p><p>[6] Churchill, A. (2019) Magic: The Gathering is Turing Complete. <a href="https://arxiv.org/abs/1904.09828">https://arxiv.org/abs/1904.09828</a>.</p>Adam Rileyhttp://www.blogger.com/profile/02560079966812151991noreply@blogger.com0tag:blogger.com,1999:blog-5981114890639901811.post-66956034988381284202023-12-05T18:01:00.000+00:002023-12-05T18:01:58.068+00:00The mountains are calling and I must go<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKI-AHRfjFjqv9_RamUPe_XpqO4PagykUs5jSpHZhQ6xTeZXZqJCgnIszX0QieBD9lqON79RZZKUWwfKsBaZMRCseZmEFhMVp8cdtCRu1AwGLhHgV-lcJLIzr0tNBw6N_Vs5TlHONHSaAXUCW7EDlTA-QqdmpRfej9lOQK8Z7VvVY9pU8OE1wFzBCLZ_s/s1280/1699626779729.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="682" data-original-width="1280" height="342" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKI-AHRfjFjqv9_RamUPe_XpqO4PagykUs5jSpHZhQ6xTeZXZqJCgnIszX0QieBD9lqON79RZZKUWwfKsBaZMRCseZmEFhMVp8cdtCRu1AwGLhHgV-lcJLIzr0tNBw6N_Vs5TlHONHSaAXUCW7EDlTA-QqdmpRfej9lOQK8Z7VvVY9pU8OE1wFzBCLZ_s/w640-h342/1699626779729.jpg" width="640" /></a></div><p></p><p style="text-align: center;"><i>Image generated with the assistance of AI [1]</i></p><p style="text-align: center;"><i><br /></i></p><p><span style="border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-style: var(--artdeco-reset-typography-font-style-italic); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">...and I will work on while I can, studying incessantly</span><span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large);">." - John Muir, 1873 [2]</span></p><p class="ember-view reader-content-blocks__paragraph" id="ember955" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Some personal news to share with you all today: after almost 13 years working at Alteryx, the time has come for me to move on to new adventures.</p><p class="ember-view reader-content-blocks__paragraph" id="ember956" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">My last day was December 1st 2023.</p><h1 style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; text-align: left; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Thank Yous</h1><h1 style="--artdeco-reset-typography_getfontsize: 3.2rem; --artdeco-reset-typography_getlineheight: 1.25; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-display-medium); font-weight: var(--font-weight-bold); line-height: var(--artdeco-reset-typography_getLineHeight); margin: 3.2rem 0px; outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: left; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large);">I have to start with the thank yous in case some of you don't make it to the end. And after 13 years there is a lot of people to thank, so apologies in advance to all the people I miss.</span></h1><p class="ember-view reader-content-blocks__paragraph" id="ember959" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">My biggest thank you has to go to Ned Harding for not only creating the fantastic piece of software that is Alteryx Desktop Designer, but for giving me the opportunity to be a part of building it. Thank you for your mentorship and friendship over the years. And of course thank you to Dean Stoecker and Libby Duane Adams for creating this place I have called home for so long. It has been an amazing journey!</p><h2 style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; text-align: left; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-display-small); font-weight: var(--font-weight-bold);">My First Alteryx</span></h2><p class="ember-view reader-content-blocks__paragraph" id="ember959" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-display-small); font-weight: var(--font-weight-bold);">This is a hard thank you list to write, as Alteryx has changed so much since when I started to when I left, that in many ways it feels like I have worked for multiple different companies. Each with its own people and styles. And suddenly I am leaving all of them at once, even though some of the earlier incarnations are long gone.</span></p><p class="ember-view reader-content-blocks__paragraph" id="ember962" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">I would like to thank all of the fine folk of the Boulder office and my "first Alteryx" for making myself and my wife so welcome when we first moved there back in 2011. There are too many to name you all but they include: Linda Thompson, Amy Holland, Tara McCoy Giovenco, Rob McFadzean, Rob Bryan, Catherine Metzger, Margie Horvath, Damian Austin, Nathalie Smith, Hannah Keller, Wendy Chow and Kim Hands.</p><h2 style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; text-align: left; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large); font-weight: var(--font-weight-bold);">The Spirit Of Alteryx</span></h2><p class="ember-view reader-content-blocks__paragraph" id="ember962" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large); font-weight: var(--font-weight-bold);">The next set of thank yous go to the people who embody the "Spirit of Alteryx" starting with Steve Algren and Linda Thompson (one of whom I think coined this phrase) for everything you do to keep that magic of what makes Alteryx special continue to burn. Especially in recent years at the Inspire conference and working with the ACEs. Which brings me to the ACEs: one of the most amazing groups of people I have the pleasure to know in my life. Some of my happiest moments have been in a room with these people, brainstorming problems and ideas of how to solve complex problems and make the product better. You are too many to call out individually, but I do have to thank Mark Frisch my team mate for the CReW macros and someone who embodies the Spirit of Alteryx in all that he does.</span></p><h2 style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; text-align: left; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large);">Projects</span></h2><p class="ember-view reader-content-blocks__paragraph" id="ember962" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large);">I will end with some thank yous for a few of my favourite projects over the years and for the good people who were there with me:</span></p><p class="ember-view reader-content-blocks__paragraph" id="ember967" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"></p><ul style="border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: var(--color-text); font-size: var(--font-size-large); line-height: 1.75; margin: var(--artdeco-reset-base-margin-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><li style="border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0.8rem; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">The CReW macros - The project that I call my greatest success and failure at Alteryx - Mark Frisch, Chris Love, Joe Mako and Daniel Brun</li><li style="border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0.8rem; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">The AMP engine - The second generation massively multi-threaded Alteryx engine. One of the projects that I am most proud of. - Ned Harding, Scott Wiesner, Chris Kingsley, Sergey Maruda, Roman Savchenko and all of the amazing C++ engineers who have contributed to that project.</li><li style="border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0.8rem; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">The Black Pearl project - The one that got away... (Naming a project after a cursed pirate ship was perhaps in hindsight asking for trouble, but I still think in a parallel universe this ship still sails on and would have been a great feature.) - Boris Perusic, David Vonka and all of the good crew who sailed that short but exciting voyage with us.</li><li style="border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0.8rem; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Control Containers - My swan song. Another one that I wasn't sure would make it out at times, but I am so happy that it did. My last big contribution to desktop designer. - The one and only Jeff Arnold who pulled it over the line with me.</li></ul><p></p><p class="ember-view reader-content-blocks__paragraph" id="ember968" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Apologies again for all the people who I have not being able to mention by name. I thank all of you for your contributions over the years.</p><h1 style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; text-align: left; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large);">My Journey</span></h1><p class="ember-view reader-content-blocks__paragraph" id="ember968" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large);">It was over 15 years ago that I first discovered a product that I then called Alteryx made by a company called SRC, and that you would now call Desktop Designer made by a company called Alteryx. And it is fair to say that product has been one of the great loves of my life. If you have ever seen the film Good Will Hunting, there is a scene in it where Matt Damon's character (Will) is trying to explain to Mini Driver's character (Skylar) how he is so good at Maths:</span></p><blockquote class="ember-view" id="ember971" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border-left: .4rem solid var(--color-brand-accent-4); box-sizing: inherit; color: var(--color-brand-accent-4); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-display-small); line-height: var(--artdeco-reset-typography_getLineHeight); margin: 3.2rem 0px; padding-left: 1.6rem; quotes: var(--artdeco-reset-base-quotes-none); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"></blockquote><blockquote><blockquote class="ember-view" id="ember971" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border-left: .4rem solid var(--color-brand-accent-4); box-sizing: inherit; color: var(--color-brand-accent-4); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-display-small); line-height: var(--artdeco-reset-typography_getLineHeight); margin: 3.2rem 0px; padding-left: 1.6rem; quotes: var(--artdeco-reset-base-quotes-none); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Will : Beethoven, okay. He looked at a piano, and it just made sense to him. He could just play.</blockquote><blockquote class="ember-view" id="ember972" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border-left: .4rem solid var(--color-brand-accent-4); box-sizing: inherit; color: var(--color-brand-accent-4); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-display-small); line-height: var(--artdeco-reset-typography_getLineHeight); margin: 3.2rem 0px; padding-left: 1.6rem; quotes: var(--artdeco-reset-base-quotes-none); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Skylar : So what are you saying? You play the piano?</blockquote><blockquote class="ember-view" id="ember973" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border-left: .4rem solid var(--color-brand-accent-4); box-sizing: inherit; color: var(--color-brand-accent-4); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-display-small); line-height: var(--artdeco-reset-typography_getLineHeight); margin: 3.2rem 0px; padding-left: 1.6rem; quotes: var(--artdeco-reset-base-quotes-none); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Will : No, not a lick. I mean, I look at a piano, I see a bunch of keys, three pedals, and a box of wood. But Beethoven, Mozart, they saw it, they could just play. I couldn't paint you a picture, I probably can't hit the ball out of Fenway, and I can't play the piano.</blockquote><blockquote class="ember-view" id="ember974" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border-left: .4rem solid var(--color-brand-accent-4); box-sizing: inherit; color: var(--color-brand-accent-4); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-display-small); line-height: var(--artdeco-reset-typography_getLineHeight); margin: 3.2rem 0px; padding-left: 1.6rem; quotes: var(--artdeco-reset-base-quotes-none); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Skylar : But you can do my o-chem paper in under an hour.</blockquote><blockquote class="ember-view" id="ember975" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border-left: .4rem solid var(--color-brand-accent-4); box-sizing: inherit; color: var(--color-brand-accent-4); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-display-small); line-height: var(--artdeco-reset-typography_getLineHeight); margin: 3.2rem 0px; padding-left: 1.6rem; quotes: var(--artdeco-reset-base-quotes-none); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Will : Right. Well, I mean when it came to stuff like that... I could always just play. [3]</blockquote></blockquote><blockquote class="ember-view" id="ember975" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border-left: .4rem solid var(--color-brand-accent-4); box-sizing: inherit; color: var(--color-brand-accent-4); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-display-small); line-height: var(--artdeco-reset-typography_getLineHeight); margin: 3.2rem 0px; padding-left: 1.6rem; quotes: var(--artdeco-reset-base-quotes-none); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"></blockquote><p class="ember-view reader-content-blocks__paragraph" id="ember976" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Well for me, when it came to Alteryx, I could always just play.</p><p class="ember-view reader-content-blocks__paragraph" id="ember977" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">And what a journey that has taken me on. I have gone from a data analyst to a principal software engineer. From an individual contributor to a director of over 50 engineers. From my first Inspire, feeling absolutely terrified talking in front of 20 people to the London Inspire at Tobacco Dock, closing out the conference on the main stage with Ned.</p><p class="ember-view reader-content-blocks__paragraph" id="ember978" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">I have laughed, cried (only once in the office), grown personally and professionally in more ways than I could ever have imagined, and made some life long friends who I am so happy are part of my life.</p><p class="ember-view reader-content-blocks__paragraph" id="ember979" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Please don't be a stranger. Always happy to meet up for a beer if you are ever in London, or jump on a zoom call and talk data and analytics.</p><h1 style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; text-align: left; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large);">Where Next?</span></h1><p class="ember-view reader-content-blocks__paragraph" id="ember979" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large);">Whenever someone posts a leaving post on LinkedIn there is always the comment that asks "where are you off to"? Well good readers that is another book that is yet to be told, and one that you will have to wait a little while to start reading. But for now let us say I am excited for a new adventure, and I will leave you with the Haiku from Alteryx past:</span></p><p class="ember-view reader-content-blocks__paragraph" id="ember982" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-style: var(--artdeco-reset-typography-font-style-italic); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Chaos reigns within.</span></p><p class="ember-view reader-content-blocks__paragraph" id="ember982" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-style: var(--artdeco-reset-typography-font-style-italic);">Reflect, repent, and restart.</span></p><p class="ember-view reader-content-blocks__paragraph" id="ember984" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-style: var(--artdeco-reset-typography-font-style-italic); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Order shall return. [4]</span></p><p class="ember-view reader-content-blocks__paragraph" id="ember985" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Adam</p><h4 style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; text-align: left; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">References:</h4><p class="ember-view reader-content-blocks__paragraph" id="ember987" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"></p><p></p><p></p><p></p><ul style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: var(--color-text); font-size: var(--font-size-large); line-height: 1.75; margin: var(--artdeco-reset-base-margin-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0.8rem; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><a href="https://www.bing.com/images/create" style="background-color: var(--artdeco-reset-link-background-color-transparent); border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; color: var(--color-action); font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">[1] Image Creator from Microsoft Designer (</a><a href="http://bing.com/" style="background-color: var(--artdeco-reset-link-background-color-transparent); border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; color: var(--color-action); font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">bing.com</a><a href="https://www.bing.com/images/create" style="background-color: var(--artdeco-reset-link-background-color-transparent); border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; color: var(--color-action); font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">)</a></li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0.8rem; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><a href="https://idiscover.lib.cam.ac.uk/permalink/f/1ii55o6/44CAM_ALMA21302612150003606" style="background-color: var(--artdeco-reset-link-background-color-transparent); border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; color: var(--color-action); font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">[2] Muir, Gifford, and Gifford, Terry. John Muir : His Life and Letters and Other Writings. London: Baton Wicks, 1996. Print. Page 190.</a></li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0.8rem; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><a href="https://www.imdb.com/title/tt0119217/quotes/?item=qt0408096&ref_=ext_shr_lnk" style="background-color: var(--artdeco-reset-link-background-color-transparent); border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; color: var(--color-action); font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">[3] Affleck, B., Damon, M., Driver, M., Elfman, D., Escoffier, J.-Y., Sant, G. V., & Williams, R. (2015). Good will hunting. Berlin; Arthaus.</a></li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0.8rem; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">[4] Early Alteryx unhandled exception error message. Original source unknown.</li></ul>Adam Rileyhttp://www.blogger.com/profile/02560079966812151991noreply@blogger.com0tag:blogger.com,1999:blog-5981114890639901811.post-19968554863622095222023-11-08T13:47:00.006+00:002023-11-08T13:48:38.076+00:00Introducing Our Latest Innovations: CReW Macros - Ensure Path and ZIP Output<p> Greetings, data enthusiasts and Alteryx aficionados! We are thrilled to unveil two exciting additions to our Chaos Reigns Within Alteryx Macro family. Say hello to "Ensure Path" and "ZIP Output," two remarkable macros designed to take your data workflow to the next level.</p><p>Available now on <a href="https://marketplace.alteryx.com/" target="_blank">Alteryx Marketplace</a>...</p><p><br /></p><h1 style="text-align: left;">Key Take-Away:</h1><div>These macros were designed to give you more flexibility in automation of your workflows. They permit you to message, warn and error so that you can take full advantage of the control containers. </div><div><br /></div><div>They use Python tool for the execution of the creation of paths and zip output. As such, we capture error codes returned (if any) in a STATUS message on each macro. Python takes time to load, so there is a penalty to pay for using the tools.</div><h2 style="text-align: left;">Ensure Path</h2><h3 style="text-align: left;">Ensuring Smooth Sailing in Your Data Journey<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgprEv6LtsPAcpKWEqziBnWLj7GiPz3P4WRS3dG8jxlf4kuEhmAYjlzVy53WA2xE_FHgLTbvTYBLr6H8sXZBSAeB1EeIx4aENBnUCsrT5XaeFHGlfHrvT-e88lvP__8GLoULXqOMIS0866WKtb4jUoUGCIaoxivCnQ8cwU8Qm8tzGdlF6uUygrCnknU2UR5/s172/CReW%20Ensure%20Directory.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="171" data-original-width="172" height="53" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgprEv6LtsPAcpKWEqziBnWLj7GiPz3P4WRS3dG8jxlf4kuEhmAYjlzVy53WA2xE_FHgLTbvTYBLr6H8sXZBSAeB1EeIx4aENBnUCsrT5XaeFHGlfHrvT-e88lvP__8GLoULXqOMIS0866WKtb4jUoUGCIaoxivCnQ8cwU8Qm8tzGdlF6uUygrCnknU2UR5/w54-h53/CReW%20Ensure%20Directory.png" width="54" /></a></div></h3><p>Managing directory paths can be a daunting task, often leading to errors and disruptions in your data processing. But fear not! Our "Ensure Path" macro is here to simplify your life. Here's why it's a game-changer:</p><p>✅ **Dynamic Directory Checking**: This macro intelligently reads incoming directory or full-path file names and dynamically checks the existence of all distinct directories.</p><p>✅ **Versatile Path Handling**: Whether you're working with absolute or UNC (Universal Naming Convention) path types, Ensure Path seamlessly accommodates both.</p><p>✅ **Comprehensive Status Updates**: Stay in the loop with detailed status reports on all directories, empowering you to monitor your workflow with confidence.</p><p>✅ **Swift Error Resolution**: In case of path creation failures, the macro provides clear error messages, enabling quick identification and resolution of issues.</p><p>✅ **Workflow Automation**: Designed with a dynamic structure, Ensure Path seamlessly integrates into your workflows, enhancing automation capabilities and eliminating manual path management.</p><p>Ready to streamline your data workflow and bid farewell to path-related hassles? Download "Ensure Path" now: [https://bit.ly/CReW_EnsurePath](https://bit.ly/CReW_EnsurePath)</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkxDlEMOOerZJDRL6hGzaCBjJwnlxKIf0JRqVCpc5IoR7qeJdBq9zt4haa1aqpXWGl2VtFrxij3Zf6PCLrNNxiDcYnMim9mcIWZllOIZmxPOQ4RnAmn-DrGCoM3BlCpu9IuFHg4LiLu0qYLIklqiFsS3KNAOw9Jve9P6NHkN5PwqjcqHzP88UXp1bNDPED/s2676/Ensure%20Fields%20Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1521" data-original-width="2676" height="365" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkxDlEMOOerZJDRL6hGzaCBjJwnlxKIf0JRqVCpc5IoR7qeJdBq9zt4haa1aqpXWGl2VtFrxij3Zf6PCLrNNxiDcYnMim9mcIWZllOIZmxPOQ4RnAmn-DrGCoM3BlCpu9IuFHg4LiLu0qYLIklqiFsS3KNAOw9Jve9P6NHkN5PwqjcqHzP88UXp1bNDPED/w640-h365/Ensure%20Fields%20Screenshot.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9wE9zH1Spz8amjDr3X6eO-WQGOtYnliNXcaD_BDYWVrm4wW5NKBpacL2ki6UtU4CPe47QtPd_Xmt7doXGlzUI2fNRNO5Xh29bKVIva_YNYipvNNvnZjiMKYHDc5j3IMSmtJNG7QpK3ZATL01OSIrpuTB0AkrynuVqtmps4cZJPGXeOdCS9HjBP67Tort-/s1131/Ensure%20Path%20Directory%20Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="505" data-original-width="1131" height="286" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9wE9zH1Spz8amjDr3X6eO-WQGOtYnliNXcaD_BDYWVrm4wW5NKBpacL2ki6UtU4CPe47QtPd_Xmt7doXGlzUI2fNRNO5Xh29bKVIva_YNYipvNNvnZjiMKYHDc5j3IMSmtJNG7QpK3ZATL01OSIrpuTB0AkrynuVqtmps4cZJPGXeOdCS9HjBP67Tort-/w640-h286/Ensure%20Path%20Directory%20Screenshot.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZun9pmOf7lJAtp83tNBk895BmsJoVWZglfzfiScPBs8R31_1O9DPsOBY6BvBCXcb2zEeXuzff7MQQGX3cKA-U3XY0rSRvm7Nu4I56ydCCA70YV09ocD9QiCsIZQJofCG5FvSBtsA0SbI9DwMsjzHhd2yvjd8P95mNC1tg_3F6PO_57tmO1NSAmir2cS6a/s3840/Ensure%20Path%20Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2160" data-original-width="3840" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZun9pmOf7lJAtp83tNBk895BmsJoVWZglfzfiScPBs8R31_1O9DPsOBY6BvBCXcb2zEeXuzff7MQQGX3cKA-U3XY0rSRvm7Nu4I56ydCCA70YV09ocD9QiCsIZQJofCG5FvSBtsA0SbI9DwMsjzHhd2yvjd8P95mNC1tg_3F6PO_57tmO1NSAmir2cS6a/w640-h360/Ensure%20Path%20Screenshot.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><h2 style="text-align: left;">ZIP Output</h2><h3 style="text-align: left;">Effortless File Archiving and Sharing**</h3><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIcxhYg7uOOwShCDKy1s99ziDlXdpMG1Q-Qj3xs6eZNt3LZMIS9ceIXT66JA2v5jKWVLuqIE5-H7CNTxCweTvhSgfwezats7ZJ8ssJEjRJ8ER2vZyT3ThSDCI54kNSuZWJzI3ADKfYzifQ7clbQDx5wasc46GfL5ZCt0JhAqkhV3P_ZdjuelcjF_cKbCz9/s176/CReW%20ZIP%20Icon.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="171" data-original-width="176" height="50" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIcxhYg7uOOwShCDKy1s99ziDlXdpMG1Q-Qj3xs6eZNt3LZMIS9ceIXT66JA2v5jKWVLuqIE5-H7CNTxCweTvhSgfwezats7ZJ8ssJEjRJ8ER2vZyT3ThSDCI54kNSuZWJzI3ADKfYzifQ7clbQDx5wasc46GfL5ZCt0JhAqkhV3P_ZdjuelcjF_cKbCz9/w51-h50/CReW%20ZIP%20Icon.png" width="51" /></a></div>If you've ever found yourself drowning in a sea of output files, our "ZIP Output" macro is here to rescue you. This macro simplifies file archiving and sharing:<p></p><p>✅ **Space-Saving Magic**: Combine multiple output files into a single, compressed ZIP folder, reducing clutter and saving valuable disk space.</p><p>✅ **Simplified Sharing**: Easily share your results with colleagues, clients, or collaborators by sending a single, compact ZIP file.</p><p>✅ **Workflow Efficiency**: Automate the archiving process within your Alteryx workflows, ensuring a smooth and organized data pipeline.</p><p>Ready to streamline your file management and sharing? Download "ZIP Output" now: [https://bit.ly/CReW_ZIPOutput](https://bit.ly/CReW_ZIPOutput)</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht5gPwG9BHinbHTKM5bBbG_EuGgEj23KEmzOu15dmG0M9h1bhPHWmoY6ih3LVgaGG6BhzZat3tTucYJ3Mp_JR36csFRmOaFyDl2YNcEZMER7bFiKf-Qszq0USGtdMo8c115LCuRxMPKCUTtG5M1prRq-3KzlBhSDMgr0lit9NA16JStlLGn_uIKkmwsAXT/s1569/CReW%20ZIP%20(DIR%20+%20File%20Option)%20Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht5gPwG9BHinbHTKM5bBbG_EuGgEj23KEmzOu15dmG0M9h1bhPHWmoY6ih3LVgaGG6BhzZat3tTucYJ3Mp_JR36csFRmOaFyDl2YNcEZMER7bFiKf-Qszq0USGtdMo8c115LCuRxMPKCUTtG5M1prRq-3KzlBhSDMgr0lit9NA16JStlLGn_uIKkmwsAXT/s1569/CReW%20ZIP%20(DIR%20+%20File%20Option)%20Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuu36jU2kzJRGVN5k3PikqNByY8YUga7QdstT-X7jSkHfSGupo3KpuWYTTS4Jd7mpqivG8YLJv3gXpffIcLY15Uv0pw5hIC_aFawqb8Onx_yRiqtrcII23fyDFOFpFxoZaIk1x0JNblH7jGG3be0qfn5e-We-IBRKwoLveIMlbyxvNpvwmPEWcPcLPcjAJ/s1161/CReW%20ZIP%20Configuration.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="754" data-original-width="1161" height="416" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuu36jU2kzJRGVN5k3PikqNByY8YUga7QdstT-X7jSkHfSGupo3KpuWYTTS4Jd7mpqivG8YLJv3gXpffIcLY15Uv0pw5hIC_aFawqb8Onx_yRiqtrcII23fyDFOFpFxoZaIk1x0JNblH7jGG3be0qfn5e-We-IBRKwoLveIMlbyxvNpvwmPEWcPcLPcjAJ/w640-h416/CReW%20ZIP%20Configuration.png" width="640" /></a><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuu36jU2kzJRGVN5k3PikqNByY8YUga7QdstT-X7jSkHfSGupo3KpuWYTTS4Jd7mpqivG8YLJv3gXpffIcLY15Uv0pw5hIC_aFawqb8Onx_yRiqtrcII23fyDFOFpFxoZaIk1x0JNblH7jGG3be0qfn5e-We-IBRKwoLveIMlbyxvNpvwmPEWcPcLPcjAJ/s1161/CReW%20ZIP%20Configuration.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAWImCc4uzqYdLVB5S5-m4g7ChTb3f0uGOce_TR6myfj8wNolc8i57nHwKZQuUI6VefKCcuTgq9X2FoFd7tXourNjfjkjgCHcalNs7fNEH0oFKx1dfagWVpCTOVJSJq10BiK-cDdzClAinMpkK9fixhTx5A9HPCb-DXPPxVz3sqX6-hbi9zZ4JCN4DRX9e/s2560/CReW%20ZIP%20Configuration%20Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="898" data-original-width="2560" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAWImCc4uzqYdLVB5S5-m4g7ChTb3f0uGOce_TR6myfj8wNolc8i57nHwKZQuUI6VefKCcuTgq9X2FoFd7tXourNjfjkjgCHcalNs7fNEH0oFKx1dfagWVpCTOVJSJq10BiK-cDdzClAinMpkK9fixhTx5A9HPCb-DXPPxVz3sqX6-hbi9zZ4JCN4DRX9e/w640-h224/CReW%20ZIP%20Configuration%20Screenshot.png" width="640" /></a></div></div><img border="0" data-original-height="456" data-original-width="1569" height="186" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht5gPwG9BHinbHTKM5bBbG_EuGgEj23KEmzOu15dmG0M9h1bhPHWmoY6ih3LVgaGG6BhzZat3tTucYJ3Mp_JR36csFRmOaFyDl2YNcEZMER7bFiKf-Qszq0USGtdMo8c115LCuRxMPKCUTtG5M1prRq-3KzlBhSDMgr0lit9NA16JStlLGn_uIKkmwsAXT/w640-h186/CReW%20ZIP%20(DIR%20+%20File%20Option)%20Screenshot.png" width="640" /></div><br /><br /><h3 style="text-align: left;">**Get Started Today!**</h3><p>Empower your data journey with these innovative CReW Macros. You can access and download them directly from the Alteryx Marketplace using the following links:</p><p>📁 **Ensure Path**: <a href="https://bit.ly/CReW_EnsurePath" target="_blank">CReW_EnsurePath</a></p><p>📁 **ZIP Output**: <a href="https://bit.ly/CReW_ZIPOutput" target="_blank">CReW_ZIPOutput</a></p><p>We believe that these macros will greatly enhance your Alteryx experience, making your data workflows more efficient and error-free.</p><p>Stay tuned for more updates and additions to our Alteryx Macro collection on ChaosReignsWithin.com. We can't wait to see how these macros help you conquer your data challenges! Happy data crunching! 🚀📊✨</p>MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com0tag:blogger.com,1999:blog-5981114890639901811.post-84645646842850215542023-11-03T14:59:00.004+00:002023-11-03T14:59:50.610+00:00Alteryx Obscura and Wordyx<p><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: var(--font-size-large);"></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi-HpQ8hnDYuPRm-SjnlzwO9Vmdit0hvLyIGBJFqTWGIhhL5P4jVpgV0nJ0OiHwRj25gg3PjpIsdcTPeVwgGq_vImsmMsUFVIqq8Aj_L2Ub5FqYg1Q-0U8jo5QVYNhHSgkaIv8bfBCnPKgZWdHbYILbDbCeSUn1t5Pm3L0OscKpAmC1OjLFMmZD3-UsZpM" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="401" data-original-width="752" height="342" src="https://blogger.googleusercontent.com/img/a/AVvXsEi-HpQ8hnDYuPRm-SjnlzwO9Vmdit0hvLyIGBJFqTWGIhhL5P4jVpgV0nJ0OiHwRj25gg3PjpIsdcTPeVwgGq_vImsmMsUFVIqq8Aj_L2Ub5FqYg1Q-0U8jo5QVYNhHSgkaIv8bfBCnPKgZWdHbYILbDbCeSUn1t5Pm3L0OscKpAmC1OjLFMmZD3-UsZpM=w640-h342" width="640" /></a></div><p></p><p><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: var(--font-size-large);">[ Cross-posting from </span><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Fira Sans, Ubuntu, Oxygen, Oxygen Sans, Cantarell, Droid Sans, Apple Color Emoji, Segoe UI Emoji, Segoe UI Emoji, Segoe UI Symbol, Lucida Grande, Helvetica, Arial, sans-serif">https://www.linkedin.com/pulse/alteryx-obscura-wordyx-adam-riley-lcmne </span><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: var(--font-size-large);">]</span></p><p><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: var(--font-size-large);">One of my favourite sessions at the Alteryx Inspire conference in recent years has been the fantastic "Alteryx Obscura" session invented by Alteryx's Steve Ahlgren. For anyone who hasn't seen the session: it is a series of lightening talks from Alteryx ACEs, employees and customers, making Alteryx do fun things that it was never designed to do.</span></p><p class="ember-view reader-content-blocks__paragraph" id="ember579" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">For anyone familiar with my prior work of <a href="http://www.chaosreignswithin.com/2010/03/alteryx-plays-chess.html" style="background-color: var(--artdeco-reset-link-background-color-transparent); border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Chess</a>, <a href="http://www.chaosreignswithin.com/2011/04/inspiring-fractals.html" style="background-color: var(--artdeco-reset-link-background-color-transparent); border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Fractals</a> and <a href="http://www.chaosreignswithin.com/2014/04/conways-game-of-life-gosper-glider-gun.html" style="background-color: var(--artdeco-reset-link-background-color-transparent); border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Conway's Game Of Life</a> in Alteryx, will find it no surprise that Obscura is my kind of session! If you haven't managed to see one of these sessions live at Inspire yet then the Polish User Group did a re-run which you can watch <a href="https://www.youtube.com/watch?v=QUKFllOWy3U" style="background-color: var(--artdeco-reset-link-background-color-transparent); border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">here.</a></p><p class="ember-view reader-content-blocks__paragraph" id="ember580" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">My presentation from 2022 was Wordyx: an implementation of a rather well known word game inside of an Alteryx workflow, played with a text input and browse tool.</p><div class="reader-image-block reader-image-block--full-width" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 16px; margin-bottom: var(--spacing-four-x); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><figure class="reader-image-block__figure" style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; display: var(--artdeco-reset-base-display-block); font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><div class="ivm-image-view-model" style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><div class="ivm-view-attr__img-wrapper display-flex" style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; display: flex; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><img alt="" class="ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view" id="ember581" loading="lazy" src="https://media.licdn.com/dms/image/D4D12AQFoVxRUXiVpHg/article-inline_image-shrink_1500_2232/0/1698761647541?e=1704326400&v=beta&t=9uQLKJyHq0R0e-m_GtW2OmbX5NRukmHqOfabMozCsOI" style="background-position: 50% 50%; background-size: cover; border-radius: 0px; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: var(--color-text); font-size: var(--artdeco-reset-base-font-size-hundred-percent); height: auto; margin: 0px auto; max-width: 100%; object-fit: cover; object-position: center center; outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline); width: 720px;" /></div></div></figure></div><p class="ember-view reader-content-blocks__paragraph" id="ember582" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">The implementation in Alteryx takes a surprisingly few number of tools!</p><div class="reader-image-block reader-image-block--full-width" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 16px; margin-bottom: var(--spacing-four-x); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><figure class="reader-image-block__figure" style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; display: var(--artdeco-reset-base-display-block); font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><div class="ivm-image-view-model" style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><div class="ivm-view-attr__img-wrapper display-flex" style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; display: flex; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><img alt="" class="ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view" id="ember583" loading="lazy" src="https://media.licdn.com/dms/image/D4D12AQHg64fiR-advA/article-inline_image-shrink_1500_2232/0/1698761695397?e=1704326400&v=beta&t=PTxhKVKgkBWyk26WWSLSxzUnQFbX4OW8EmrfO0kk3m8" style="background-position: 50% 50%; background-size: cover; border-radius: 0px; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: var(--color-text); font-size: var(--artdeco-reset-base-font-size-hundred-percent); height: auto; margin: 0px auto; max-width: 100%; object-fit: cover; object-position: center center; outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline); width: 720px;" /></div></div></figure></div><p class="ember-view reader-content-blocks__paragraph" id="ember584" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">We recently did an internal re-run here at Alteryx and I was asked if I could share the workflow from my Wordyx presentation, which I am very pleased to do here.</p><p class="ember-view reader-content-blocks__paragraph" id="ember585" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><a href="https://downloads.chaosreignswithin.com/Wordyx.yxzp" style="background-color: var(--artdeco-reset-link-background-color-transparent); border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">https://downloads.chaosreignswithin.com/Wordyx.yxzp</a></p><p class="ember-view reader-content-blocks__paragraph" id="ember586" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">My 2023 presentation Blackjayx was less of a successful workflow (and not one that is yet in a state to share), but I did have the great pleasure of sharing a stage with a "virtual" <a href="https://en.wikipedia.org/wiki/Ian_Livingstone" style="background-color: var(--artdeco-reset-link-background-color-transparent); border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Sir Ian Livingstone</a>! Certainly a highlight of my career.</p><p class="ember-view reader-content-blocks__paragraph" id="ember586" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); pointer-events: all; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Adam Riley</p>Adam Rileyhttp://www.blogger.com/profile/02560079966812151991noreply@blogger.com0tag:blogger.com,1999:blog-5981114890639901811.post-88595923940181596382023-10-05T11:00:00.065+01:002023-10-05T15:59:30.822+01:00Announcing Alteryx Marketplace | CReW Macros Available via Alteryx!<p>Alteryx has launched their new <a href="https://marketplace.alteryx.com/" target="_blank">Marketplace</a> for Add-Ons.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCd21KOT2zcJnwSg1drLBcPeBewBnTKOvB4B6TFknngJcdaSpysaeTFZJa4vHD961ubXbx8j3Jxg1htuFV6gj52fhfoufP9YX0ym-ioTY3ctogOif2aL6e8n4oR7y1DPSuLEWEeexT27kw7gF9G9x1CyinDJuZRRYq3pisQ-m_af65bUAkcDYk6BC-Z_aB/s1100/Picture1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="605" data-original-width="1100" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCd21KOT2zcJnwSg1drLBcPeBewBnTKOvB4B6TFknngJcdaSpysaeTFZJa4vHD961ubXbx8j3Jxg1htuFV6gj52fhfoufP9YX0ym-ioTY3ctogOif2aL6e8n4oR7y1DPSuLEWEeexT27kw7gF9G9x1CyinDJuZRRYq3pisQ-m_af65bUAkcDYk6BC-Z_aB/s320/Picture1.png" width="320" /></a></div><br /><p><span style="font-size: 12pt; line-height: 107%;">T</span>he Alteryx
Marketplace will be <i>the</i> place to find the latest and greatest for your
data journey. </p><p class="MsoNormal"><o:p></o:p></p>
<span face=""Calibri",sans-serif" style="font-size: 11pt; line-height: 107%; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Featured Add-Ons in October include some of the
most used tools and macros created and managed by CReW Macros. CReW Macros have
already saved Alteryx users hours, if not days, with their efficient and thoughtful
tools, and now you can access them on the Alteryx Marketplace as verified and
supported Add-Ons. See their power in action in quick demo videos <a href="https://marketplace.alteryx.com/en-US/listing?q=CreW&page=1&locale=en-US" target="_blank">here</a>.</span><p></p><p>Featured Macros Include: Ensure Fields, Expect Equal, Expect Records, Expect Zero Records, Grouped Record ID, Control Container Error Check, Only Unique.</p><p>More are coming soon!</p><p>Ensure Fields<span> </span><span> </span><span><span> </span></span><a href="https://bit.ly/CReW_EnsureFields">https://bit.ly/CReW_EnsureFields</a><br />Expect Equal<span> </span><span> </span> <a href="https://bit.ly/CReW_ExpectEqual">https://bit.ly/CReW_ExpectEqual</a><br />Expect Records<span> </span><a href="https://bit.ly/CReW_ExpectRecords">https://bit.ly/CReW_ExpectRecords</a><br />Expect Zero Records<span> </span><a href="https://bit.ly/CReW_Expect0Records">https://bit.ly/CReW_Expect0Records</a><br />Grouped Record ID<span> </span><a href="https://bit.ly/CReW_GroupedRecordID">https://bit.ly/CReW_GroupedRecordID</a><br />Control Container Error Check<span> </span><a href="https://bit.ly/CReW_ControlContainerErrorCheck">https://bit.ly/CReW_ControlContainerErrorCheck</a><br />Only Unique<span> </span><a href="https://bit.ly/CReW_OnlyUnique">https://bit.ly/CReW_OnlyUnique</a></p><p>Don't worry! CReW isn't going anywhere. We are simply making it easier for access to the best macro add-ons directly from Alteryx. </p><p>Cheers,</p><p><br /></p><p>Mark (and Adam)</p><p><span style="background-color: white; color: #252d39; font-family: Montserrat; font-size: 16px;">Please <a href="https://youtube.com/channel/UC8ELS4rnehKRmAJ6wC28hfw?sub_confirmation=1" target="_blank">Subscribe</a> to my youTube channel. </span></p><p></p><p></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><br /><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><br /><p></p><br /><br /><p></p><p><br /></p>MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com1tag:blogger.com,1999:blog-5981114890639901811.post-69182494560256806852023-05-24T01:00:00.002+01:002023-05-24T01:00:00.132+01:00Control Containers - Part 2 - CReW Container Error Check Macro<p>In part 1 of this series we looked at the case where we didn't have an input hooked up to our control container in the logging container. This time we are going to look at what we can do with the input anchor connected.</p><h2 style="text-align: left;">How does the Input Anchor work?</h2><div>We noted in the last post that without an input anchor the control container works very much like the CReW Runner macro. Well if we connect up the input anchor then the control container works very much like the CReW Conditional Runner macro. That is to say:</div><div><ul style="text-align: left;"><li>If the Input Anchor is disconnected</li><ul><li>All tools inside run as though they were in a regular container (or straight on the canvas)</li></ul><li>If the Input Anchor is connected</li><ul><li>If the input anchor receives 0 records – The tools in the Control Container DO NOT run</li><li>If the input anchor receives >0 records – The tools in the Control Container run AFTER the last input record is received</li></ul></ul><div>Or in pictures</div></div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhF33M7ctZVsD045DZwqeGljQM1mqs8ksHNJ4tDa3aqtZiNJxSGoy9vROlmBeAbyVotsNZgZkKZMFcIbfeUKaeC1hsIbCiQR3s87UDGfaZYB1bSa1qmfvn7ughIDozdKDag7I4kXLNm41BTIL7MKEOBHvpVYDSFjljee7n-snKq2j7ujFWp892BVzRb" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="521" data-original-width="1328" height="252" src="https://blogger.googleusercontent.com/img/a/AVvXsEhF33M7ctZVsD045DZwqeGljQM1mqs8ksHNJ4tDa3aqtZiNJxSGoy9vROlmBeAbyVotsNZgZkKZMFcIbfeUKaeC1hsIbCiQR3s87UDGfaZYB1bSa1qmfvn7ughIDozdKDag7I4kXLNm41BTIL7MKEOBHvpVYDSFjljee7n-snKq2j7ujFWp892BVzRb=w640-h252" width="640" /></a></div><br /><br /></div><div><div class="separator" style="clear: both; text-align: center;"><h2 style="text-align: left;">Introducing the Container Error Check Macro</h2><div style="text-align: left;">With this we now are very close to replacing the CReW Runner macros with Control Containers! All we need is the S and F outputs provided by the runner macros. We replace this with the Container Error Check Macro.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">You can download it from:</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><a href="http://downloads.chaosreignswithin.com/CReW_ContainerErrorCheck.yxmc">http://downloads.chaosreignswithin.com/CReW_ContainerErrorCheck.yxmc</a></div><div style="text-align: left;"><br /></div><div style="text-align: left;">(To install it copy it into the macros folder where you have the CReW macros installed on your machine. For example C:\CReWMacros\Macros)</div><div style="text-align: left;"><br /></div><div style="text-align: left;">You connect it directly after a control container and it has the following behaviour:</div><div style="text-align: left;"><ul style="text-align: left;"><li>If the incoming log messages contain an error all records get pushed out of F (Fail) output</li><li>If incoming log messages have no errors all records get pushed out of S (Success) output</li></ul><div>Anyone who has used the Runner macros will find this very familiar.</div><div><br /></div><h2 style="text-align: left;">Conditional Running</h2><div>Using this macro we can now conditionally run parts of our workflow!</div><div><br /></div><div>Success case:</div><div><br /></div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiv5spHw0Zzgq_WZGTAarW6mdEVu0Csz7UKaLiCA7WByPUBFbv3iOenMOSPXdgn31eaQKn1f-VeHthEhidlLZ2qpOBzEx8jZAjqjIbAOxac4fX2D9W5G6PpGdTu3aSvp5PlcicmQevzDrgJgFl6I1pFuKJfwDijfk9FjfmD5PoFYyGpOJr71omRPnUx" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="607" data-original-width="1359" height="286" src="https://blogger.googleusercontent.com/img/a/AVvXsEiv5spHw0Zzgq_WZGTAarW6mdEVu0Csz7UKaLiCA7WByPUBFbv3iOenMOSPXdgn31eaQKn1f-VeHthEhidlLZ2qpOBzEx8jZAjqjIbAOxac4fX2D9W5G6PpGdTu3aSvp5PlcicmQevzDrgJgFl6I1pFuKJfwDijfk9FjfmD5PoFYyGpOJr71omRPnUx=w640-h286" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Failure case:</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjUtOLvGO6HcFBl-ENrEtAJY6fkmGwnW3hraR80yg-YMOt8HKNmz48P2_uFRM31TqBKK6GzflK1FJO45IKRX9mGgmR9pJG0RubdqeAue9aUWGUFjApjvJpmlnmo07yBJUwGFv6g-7srDK4tUhIwHuVn4tfCmfRIqY-DVl1hXdEQHPTLxg7PeW7xPQzE" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="608" data-original-width="1374" height="284" src="https://blogger.googleusercontent.com/img/a/AVvXsEjUtOLvGO6HcFBl-ENrEtAJY6fkmGwnW3hraR80yg-YMOt8HKNmz48P2_uFRM31TqBKK6GzflK1FJO45IKRX9mGgmR9pJG0RubdqeAue9aUWGUFjApjvJpmlnmo07yBJUwGFv6g-7srDK4tUhIwHuVn4tfCmfRIqY-DVl1hXdEQHPTLxg7PeW7xPQzE=w640-h284" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">This workflow generates a PDF report and then if there are no errors uploads it via an API using the download tool. If on the other hand there are errors, then the file is not uploaded, but an email is sent instead.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><h2 style="clear: both; text-align: left;">Learn More</h2></div><div style="text-align: left;">If you are at Inspire today, please come to my breakout session to learn about this use case and more. </div><div style="text-align: left;"><br /></div><div style="text-align: left;">If you aren't at Inspire, but would like me to present this talk at your local user group them please get in touch and we can set up a date!</div></div></div></div></div></div>Adam Rileyhttp://www.blogger.com/profile/02560079966812151991noreply@blogger.com0tag:blogger.com,1999:blog-5981114890639901811.post-26805281108318270482023-05-22T21:50:00.000+01:002023-05-22T21:50:12.661+01:00Control Containers - Part 1 - Logging Container<p>Well it is Adam here. I'm back posting on my personal Alteryx Blog after a very long time, but Control Containers are such an important new feature to desktop designer (that I have wanted to see in the product for so long) that I just had to write a blog post about them.</p><p><br /></p><h2 style="text-align: left;">What are Control Containers?</h2><p>In short Control Containers are the biggest innovation in controlling the order of how things run in an Alteryx workflow since we released the CReW runner macros over 8 years ago. Ever wanted to control what order your outputs write in? Or run one section of a workflow before another? Or how about capturing logging and error messages? Control containers can do all of this and I suspect more things that we havn't even thought of yet. I don't say this lightly, but I think Control Containers are going to be a game changer with what you can do in an Alteryx workflow.</p><p>They were released last week as part of the 2023.1 release <a href="https://help.alteryx.com/release-notes/designer/designer-20231-release-notes">https://help.alteryx.com/release-notes/designer/designer-20231-release-notes</a></p><p>They are so innovative that myself and Jeff Arnold who worked on the initial design for control containers got a patent granted for the idea <a href="https://image-ppubs.uspto.gov/dirsearch-public/print/downloadPdf/20230113187">https://image-ppubs.uspto.gov/dirsearch-public/print/downloadPdf/20230113187</a>.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhpodG0xVGmCX3X8Qsnz0bz7D5CZm_UiAP9CSLoJS3SnzGtaQeVTFmoKuxA_UtwLErBzsFwjOtyKHxpCnl4MR4ZgngPtcJLJdKuUs2vIPgQKd7NUX7hZfvWS76MCiDGUjDZ_s4mjiFWpqG1HQai9NUJpbbu6u-WbPrPrIg1uKakW_3FM2T2JJyQGUV9" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="567" data-original-width="1376" height="165" src="https://blogger.googleusercontent.com/img/a/AVvXsEhpodG0xVGmCX3X8Qsnz0bz7D5CZm_UiAP9CSLoJS3SnzGtaQeVTFmoKuxA_UtwLErBzsFwjOtyKHxpCnl4MR4ZgngPtcJLJdKuUs2vIPgQKd7NUX7hZfvWS76MCiDGUjDZ_s4mjiFWpqG1HQai9NUJpbbu6u-WbPrPrIg1uKakW_3FM2T2JJyQGUV9=w400-h165" width="400" /></a></div><br />This series of blogs is going to teach you about how Control Containers work through a number of example use cases of what you can do with them.<p></p><p><br /></p><h2 style="text-align: left;">First up the Logging Container!</h2><p>When Jeff and I were first throwing around ideas for Control Containers, I actually had proposed that the feature would consist of two tools: A Logging Container and a Control Container. The Logging Container being exactly the same as a Control Container, but with no input anchor. In the end we ended up with a single Container with an optional input. So for now let us pretend the Control Container has no input anchor and just focus on what that output anchor does.</p><p>First of all like a regular container a Control Container groups together a set of tools. The first difference we will look at though is that new output anchor.</p><p>When a workflow runs, all of the log messages for tools inside the container that usually get written to the messages window, also get output as data from the Control Container's outpur anchor. For anyone familiar with the CReW runner macros this use case is very much like the CReW runner macro, but in a single workflow!</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgSBJTIsYxJ5cc1PmtHWHJUdi5gXq4yYGLLB-19kC_1nI-6Cxn8zL70YCuyPb6VJI-q6Md9KEwRZKxnQ107wl5P-PgDcIG_JMkb-Rqo0olQsc0o4wIYTv-dCdYbIoDO3T6vkwwc8bH2H9nMDMe81iVv1HM2mFp11YeKzrZn0GwthjS7t4bizfwOzBLw" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="291" data-original-width="629" height="148" src="https://blogger.googleusercontent.com/img/a/AVvXsEgSBJTIsYxJ5cc1PmtHWHJUdi5gXq4yYGLLB-19kC_1nI-6Cxn8zL70YCuyPb6VJI-q6Md9KEwRZKxnQ107wl5P-PgDcIG_JMkb-Rqo0olQsc0o4wIYTv-dCdYbIoDO3T6vkwwc8bH2H9nMDMe81iVv1HM2mFp11YeKzrZn0GwthjS7t4bizfwOzBLw" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjI6BWpqGOj2faDMhCfEaal8F__2wfGEVsWsTYC4re6Nnlr4cFEwOOWX3V0aNsT8L4HV64II_Ocjo4DIcReZZ9hj4l1nJSa_tLed0-OVe-wTX97TUNi_SP7jNLzA_51_PYCqxcBwG20vNPxsnqnDXSuoiGWGYSKE8P6FJUNdnsXAAWn0XW4elB-Cgqb" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="321" data-original-width="1400" height="73" src="https://blogger.googleusercontent.com/img/a/AVvXsEjI6BWpqGOj2faDMhCfEaal8F__2wfGEVsWsTYC4re6Nnlr4cFEwOOWX3V0aNsT8L4HV64II_Ocjo4DIcReZZ9hj4l1nJSa_tLed0-OVe-wTX97TUNi_SP7jNLzA_51_PYCqxcBwG20vNPxsnqnDXSuoiGWGYSKE8P6FJUNdnsXAAWn0XW4elB-Cgqb" width="320" /></a></div><br /><br /></div><br />So what is this useful for? Well a number of things, but today we will use it to create an audit trail for our workflow. We enclose the entire workflow in a Control Container and then using regular Alteryx tools we add the current datetime and workflow name and write it to a database.<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi5DbXBSjSz74kIaEKFAvR2-kySUGRUepIxsX4V7zTJFhTieRcwO_WdGawxTLtY9KZEsjy0gU-MVFe1XkZFKOMrhd1IhIKDn8oTf0qyNeBuexA5H3ddXVnN68GyuELdFXCHMDBGyGqjtWIFtf_5UFV6zBLEIlHLlFiKxoUgRrFGe9Hs1nAY_mZXH5Nx" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="259" data-original-width="716" height="116" src="https://blogger.googleusercontent.com/img/a/AVvXsEi5DbXBSjSz74kIaEKFAvR2-kySUGRUepIxsX4V7zTJFhTieRcwO_WdGawxTLtY9KZEsjy0gU-MVFe1XkZFKOMrhd1IhIKDn8oTf0qyNeBuexA5H3ddXVnN68GyuELdFXCHMDBGyGqjtWIFtf_5UFV6zBLEIlHLlFiKxoUgRrFGe9Hs1nAY_mZXH5Nx" width="320" /></a></div><br />Now every time this workflow runs we can capture this information and build up a historical record of how things change over time!<p></p><p><br /></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgo5epuei3GBPuVQJicuBBpD3aHv5F2v9kBCsitXJEcaC9sDOVcjHYBJIonn9A25huwgwEnrc1Pp7QvSlii4-9AHcnnG8Pzrbv_zu_s2D92tL0xqHB45KEh_Z24FIJqA3Yeo4cyKlAS0UAUM-4AFwfWbVz1c9n-gJpWE5TtUq9AH2FODQfZPWYL5GwQ" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="370" data-original-width="941" height="126" src="https://blogger.googleusercontent.com/img/a/AVvXsEgo5epuei3GBPuVQJicuBBpD3aHv5F2v9kBCsitXJEcaC9sDOVcjHYBJIonn9A25huwgwEnrc1Pp7QvSlii4-9AHcnnG8Pzrbv_zu_s2D92tL0xqHB45KEh_Z24FIJqA3Yeo4cyKlAS0UAUM-4AFwfWbVz1c9n-gJpWE5TtUq9AH2FODQfZPWYL5GwQ" width="320" /></a></div><br /><p></p><p>Next time we will introduce a new CReW macro tool for making this logging data even more useful.</p><p>For anyone at Inspire this week in Las Vegas, please come to my session on Wednesday when we will talk about this use case and a lot more!</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhdaqL30aw5vrFYYrE91HKNpAIJi19x9QXyA2dWXWvyJdBVG3r31bgsymBIz-X1glEGOBnk3R5Ti-pUrX9-1R8gyl2boI3ufsTsrgWDXGoKdmRLS0Z9L1XwhJMZbwYV94fn7ReM_0Umyp6qd5DZxO5ZjiVY-lUZFfU4LGxrp1jRRRnLa9MKs_6A7-tJ" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="360" data-original-width="640" height="180" src="https://blogger.googleusercontent.com/img/a/AVvXsEhdaqL30aw5vrFYYrE91HKNpAIJi19x9QXyA2dWXWvyJdBVG3r31bgsymBIz-X1glEGOBnk3R5Ti-pUrX9-1R8gyl2boI3ufsTsrgWDXGoKdmRLS0Z9L1XwhJMZbwYV94fn7ReM_0Umyp6qd5DZxO5ZjiVY-lUZFfU4LGxrp1jRRRnLa9MKs_6A7-tJ" width="320" /></a></div><br /><br /><p></p><p><br /></p>Adam Rileyhttp://www.blogger.com/profile/02560079966812151991noreply@blogger.com0tag:blogger.com,1999:blog-5981114890639901811.post-38285834611708010012022-08-16T17:09:00.003+01:002022-08-16T21:18:05.347+01:00CReW Expect Records, or "What to expect when you're expecting data"<p> This morning I awoke to a WhatsApp message from my friend, @grossal (Alex) asking the following:</p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><p><i>[5:12 AM, 8/16/2022] Alex Gross: Is there a CReW "Expect Records" Macros? </i></p><p><i>I see a lot of time Use Cases, e.g. Database Connections or files where I need to check if records come in. I think this could also be useful for the SHA256 Macro.</i></p><p><i>I just had the scenario where I connected to a database and got zero records back - but it didn't crash my workflow because the metadata was still provided by the db.</i></p></blockquote><p>Alex had already explored the macro updates to either create a cloned copy of the existing macro or to include functionality to choose between expect 0 or expect something. It would be easy. </p><p>Easy is in the eye of the beholder. I knew that I'd have to change the image and that change would complicate everything. I also don't want to interfere with any existing use of the macro. I opted for another macro. Of course, I'd opt for Alteryx to include an ERROR condition on tools that they should allow for an ERROR if 0 records are passed through them.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyY_AEZ8SmMbjRtblPETdUABrn2xaZdaQ_0mILCwgTop7qmBCCpJc0_WBwjlhflj7RgkUovuAsYZ2W6H3TFRsZh87SzYj05AoSqI7lJ4SQoDlYCLeeXU2gA7a9DaoWDsazro9GksifE4kqPMYxpZG-ZaETG0GmPIz7AN_aJbs5fwv75RhvCrVs2Yhreg/s1351/capture.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="677" data-original-width="1351" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyY_AEZ8SmMbjRtblPETdUABrn2xaZdaQ_0mILCwgTop7qmBCCpJc0_WBwjlhflj7RgkUovuAsYZ2W6H3TFRsZh87SzYj05AoSqI7lJ4SQoDlYCLeeXU2gA7a9DaoWDsazro9GksifE4kqPMYxpZG-ZaETG0GmPIz7AN_aJbs5fwv75RhvCrVs2Yhreg/s320/capture.png" width="320" /></a></div><br /><p>Another vertical workflow! Instead of using a COUNT RECORDS macro, I opted for using the JOIN tool (configured with join by record position). When 0 records are present in the I (Input) anchor, then the "Error Message" data is passed to the MESSAGE tool. That tool is configured as an "<span style="color: red;">ERROR</span>" and passes the contents of the TEXT INPUT tool to the Results panel.</p><p>This method is ever so slightly more performant. But more importantly it doesn't include another macro inside of it. That simplicity appealed to me. When I can use fewer tools and less macros (oxymoron) I think that I've got a winner. After testing with and without AMP and testing just to see that it works I am confident enough to let you, my friends check it out too.</p><p>You can find the macro in the Alteryx Community (<a href="https://community.alteryx.com/t5/Public-Community-Gallery/CReW-Expect-Records/ta-p/984111" target="_blank">Gallery</a>). Right now I'm getting ready for Alteryx & Beer with Alex and the German Alteryx Community.</p><p>Cheers,</p><p><br /></p><p>Mark</p><p>P.S. During the Alteryx & Beer session, I was coerced into creating an output anchor for the macro. If data is present (e.g. NOT an error), the data will pass through the macro. This was an ask and so it was made to happen.</p><p>P.P.S If you have a LARGE set of data, the "Count Records" method will literally count every record. This method only requires 1 record to know if things are kosher or not.</p><br /><p><br /></p>MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com0tag:blogger.com,1999:blog-5981114890639901811.post-73850040442889985652022-08-03T17:43:00.004+01:002022-08-03T18:33:26.531+01:00CReW SHA256 Macro: Enter the Python<h1 style="text-align: left;"> Did CReW just freeze over?</h1><h2 style="text-align: left;">CReW SHA256 Macro</h2><div>This wasn't the first rodeo for me, but it is the first time that I've publicly created a macro that uses the python tool in Alteryx. I pride myself in doing things with BASE-A (100% Alteryx) whenever possible. That happens virtually 100% of the time. But until Alteryx adds SHA256 (or other encryption) to their products (note: a FIPS version of Alteryx is available <a href="https://help.alteryx.com/20221/designer/alteryx-designer-fips" target="_blank">help.alteryx.com</a>), this macro will get SHA256 encryption on your current (2022.2) version.</div><div><br /></div><h3 style="text-align: left;">Where is the macro?</h3><div>This link is at the top of the article for those who don't care about the making of the macro....</div><div><br /></div><div><a href="https://community.alteryx.com/t5/Public-Community-Gallery/CReW-SHA256-Encryption/ta-p/978507" target="_blank">Alteryx Community Gallery</a><br /></div><div><br /></div><h3 style="text-align: left;">How does it work?</h3><div>Select a single data field (String Type) and it will be SHA256 encrypted as: [SHA256_Output]. There are warnings if EMPTY data is present or if the incoming data is NOT lowercase (the macro will automagically lowercase the input field). If you don't want these features turned-on, you can disable them in the macro configuration.</div><div><br /></div><div>The entire record is read and output by the macro. Only the SHA256Input field is passed into a python tool which uses HASHLIB and encrypts your field. If the incoming data is Empty(), it is bypassed. If you have lots of duplicate data, you might want to UNIQUE that data and only pass the unique values through the tool. It runs about 2,000,000 records per minute on my computer (with AMP on). Without AMP, it runs about 50% slower for this function. </div><div><br /></div><div>Memory and AMP and Python can lead to shortages of memory. Use caution. If you experience memory-related issues, you might want to keep things simple. I ran 200 million records through this process in less than 1.5 hours while testing.</div><div><br /></div><h4 style="text-align: left;">What's inside the box?</h4><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBhGOP1UdjY1-x3X1wZwWSfmmFyJbgCtPY08Xo8X2FZXkpeo_UUKQihcNt2jPowNqFqmXW_c95G9xStdRrOag9REWHQaS3EZweTYZoUiqnQVnp3KUj2GGuTwawi_1wV5BO0S9GYirT4Cul42297iKv8RwiR-0tDbu2R2j6QWxq1y_ya9lpT2T3uWn0uQ/s2301/CReW_SHA256%20Workflow%20pic.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="804" data-original-width="2301" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBhGOP1UdjY1-x3X1wZwWSfmmFyJbgCtPY08Xo8X2FZXkpeo_UUKQihcNt2jPowNqFqmXW_c95G9xStdRrOag9REWHQaS3EZweTYZoUiqnQVnp3KUj2GGuTwawi_1wV5BO0S9GYirT4Cul42297iKv8RwiR-0tDbu2R2j6QWxq1y_ya9lpT2T3uWn0uQ/w640-h224/CReW_SHA256%20Workflow%20pic.png" width="640" /></a></div><h4 style="text-align: left;">Input:</h4><div>Your incoming data is routed through a common RecordID tool and the entire record circumvents the encryption process and awaits the results in a JOIN tool (append to end of record).</div><div><br /></div><h4 style="text-align: left;">Process-Prepare for Encryption</h4><div>A formula tool assigns the selected (Interface Drop-Down) string field into the __SHA256Input__ field. Conversion warnings (MESSAGE) are issued if the input field is Empty(). Conversion warnings are also issued if the input field contains uppercase letters. The input field is converted to lowercase() for all records. If these function offend you, you can deselect the execution of the preparation functions in the configuration (via CheckBox that updates the DETOUR).</div><div><br /></div><h4 style="text-align: left;">Python - SHA256 Encryption</h4><div>Empty data is filtered and then unioned to the results of the encryption. Data then goes into the Python tool and the following script is executed (please note that the script is saved as a comment inside of a disabled container):</div><div><br /></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;">#################################</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;">from ayx import Package</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;">from ayx import Alteryx</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;">import hashlib</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;">#################################</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;">df = Alteryx.read('#1')</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;">#################################</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;">def text_to_sha256(text):</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;"> h=hashlib.new('sha256')</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;"> h.update(text.encode('ascii'))</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;"> return h.hexdigest()</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;">#################################</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;">df['SHA256_Output'] = df.apply(lambda row: text_to_sha256(row['__SHA256Input__']),axis=1)</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;">#################################</span></div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><div><span style="background-color: #eeeeee; font-family: courier;">Alteryx.write(df,1)</span></div></div></blockquote></blockquote><div><br /></div><div>The python tool reads #1 input and outputs via #1. The imported library, hashlib, is used to created a function that converts text to sha256. A dataframe for output uses a lambda function to parse the data from __SHA256Input__ and creates your SHA256_Output field.</div><div><br /></div><div>In an effort to minimize the python use of memory (as tested python uses 50% more memory than Alteryx was consuming), only the RecordID and SHA256Input are passed through this tool. The tool is configured in "Production Mode". A copy of the script is saved as a comment as friends of mine tell me is a good practice (sometimes it is lost otherwise).</div><div><br /></div><h4 style="text-align: left;">Error Checking:</h4><div>What could go wrong? I can't imagine records being lost in the join, but should it happen there are two (2) CReW Expect 0 macros waiting to throw error messages if any unjoined data tries to escape the macro.</div><div><br /></div><div><br /></div><h2 style="text-align: left;">In Closing:</h2><div>It has been a while since I've posted. The community gallery is where I've been stashing macros. Every once in a while I hear questions about the use of CReW while using AMP. On my to-do list is to look through the parallel-BUD tool and modify it to be AMP compatible. In reading community posts it seems that it might not work without compatibility mode enabled. If you have any CReW or AMP feedback/concerns (related to CReW), please let us know.</div><div><br /></div><div>A special note of thanks to Alex Gross (AYX Community @grossal), ACE and friend who helped to get through some python woes.</div><div><br /></div><div>Cheers,</div><div><br /></div><div>Mark</div><div><br /></div><div><br /></div>MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com0tag:blogger.com,1999:blog-5981114890639901811.post-6695606255224209412021-11-15T20:35:00.000+00:002021-11-15T20:35:28.808+00:00Alteryx Runner 🏃 Macro: Check out the Alteryx Gallery!<p>Inside of the Alteryx Gallery, find the Districts page and look for Alteryx Product District:</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ8ivkwyrZ-rIv_7gFO44Uyw_3_0esD_AGaO1AFtTyshm8ZRjNHZwzVIr2WKRkzuDRD8TITchWy7Ufbs-CJ68cjqjVcgxwvraUs0_RiNlIGSwXmtt3OJK3vMxHDAkmmSegtCinfipJMoSe/" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img alt="" data-original-height="70" data-original-width="70" height="75" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ8ivkwyrZ-rIv_7gFO44Uyw_3_0esD_AGaO1AFtTyshm8ZRjNHZwzVIr2WKRkzuDRD8TITchWy7Ufbs-CJ68cjqjVcgxwvraUs0_RiNlIGSwXmtt3OJK3vMxHDAkmmSegtCinfipJMoSe/w75-h75/image.png" width="75" /></a></p><p>Scroll down and you'll find the Runner macro (from Alteryx)</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTc_1mn5KGut5EL3KvK97R41V_LTSEsYmVV9UhkafZObLMofTqxISkiouBDF2JuRWlXCemmJ6SYaIImRvcJXezoSD3ZzGXpV7Zrjm6KOI9Akwd1RUIosZsSxgHIhKNj1fdRgkvEeWgPzwN/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="116" data-original-width="372" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTc_1mn5KGut5EL3KvK97R41V_LTSEsYmVV9UhkafZObLMofTqxISkiouBDF2JuRWlXCemmJ6SYaIImRvcJXezoSD3ZzGXpV7Zrjm6KOI9Akwd1RUIosZsSxgHIhKNj1fdRgkvEeWgPzwN/" width="320" /></a></div><p>If that's all you need to get running, you can quit here. The Alteryx runner macro works the same as the CReW Runner macro. If you're asking, "Where can I find the other Runner macros?" I don't have an answer for when they may appear. But I can tell you that if you're looking for a List Runner macro that you're in luck. We're prepared to show you a quick DIY hack for creating a List Runner macro out of the "official" Alteryx Runner macro.</p><h2 style="text-align: left;">Ingredients:</h2><p><a href="https://gallery.alteryx.com/download" target="_blank">Download Link</a><br /></p>Control Parameter<p></p><p>Action</p><p>Macro Output (x2)</p><h2 style="text-align: left;">Instructions:</h2><p>Download the macro (yes, you can use the link above.)</p><p>Save the macro somewhere special. Don't worry about error messages regarding their assets.</p><p>Open a new workflow and insert the Runner Macro.</p><p>Above the macro place your control parameter onto the canvas.</p><p>Connect the Q anchor to the Lightning bolt on the RUNNER tool set action to update the "Value" on the Runner.</p><p>Connect a Macro Output tool to each of the RUNNER anchors (Label them Success 'S' and Failure 'F' properly).</p><p>Save!</p><h2 style="text-align: left;"><b>Additional Learning Option:</b></h2><div>Watch Esther & me walk you through the process in a YouTube video: <br /><a href="https://youtu.be/mKpJjVYH-yU" target="_blank">https://youtu.be/mKpJjVYH-yU</a></div><p>You can improve the quality of the macro and let us know what you've done. Perhaps you can save your macro to Alteryx? </p><p>I'm not posting this macro here. Why? We already have a CReW List Runner.</p><p>Cheers,</p><p><br /></p><p>Mark</p><p></p><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><br /><p></p>MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com0tag:blogger.com,1999:blog-5981114890639901811.post-22155916788740360172020-12-17T01:12:00.003+00:002020-12-29T18:00:36.047+00:00CReW Data Cleanse<p>Yet another new macro is about to be released! Alteryx has "AMP"ed up their game and while not all tools are AMP-Compatible, surely more speed is coming. I've long thought about taking a stab at a CReW Data Cleanse tool, but since the release of an ALTERYX macro that delivers that functionality I have stayed in the peanut gallery. I'll be releasing a CReW macro before Christmas 2020. On Friday, December 18th I will surprise the Dallas-Fort Worth User Group (Virtual) with a presentation on the macro instead of (or in addition to) their expected presentation on CReW Generate Dummy Variables.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIIokNVASovEdNbniXrXjWU1dE9G75BrNK2hIuLvHWDnU3118RcTZSa97EZFd6-76X7wFOCZDrlKCgoXFLALznHrGnF2o1ZVFgQrHyoKglt5wQ1a8nzASJycPKHi6j8YkxJQ9eJCNBDer9/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="450" data-original-width="800" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIIokNVASovEdNbniXrXjWU1dE9G75BrNK2hIuLvHWDnU3118RcTZSa97EZFd6-76X7wFOCZDrlKCgoXFLALznHrGnF2o1ZVFgQrHyoKglt5wQ1a8nzASJycPKHi6j8YkxJQ9eJCNBDer9/" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihfQEFrZLUJghffeJvQ8VHwT4SLyRUrARe9hEkIUlMZBglpV93uDVX79dWEnHpSHN_1rPnCizkco5mIzMahva_ZVu3n5hyphenhyphenprDgy48vRfL4pHPrGDRZy5oxOCNSAE9_YMRN0GpFF40YpdS1/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="450" data-original-width="800" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihfQEFrZLUJghffeJvQ8VHwT4SLyRUrARe9hEkIUlMZBglpV93uDVX79dWEnHpSHN_1rPnCizkco5mIzMahva_ZVu3n5hyphenhyphenprDgy48vRfL4pHPrGDRZy5oxOCNSAE9_YMRN0GpFF40YpdS1/" width="320" /></a></div><p><br /></p><i>When you use one (or more) Data Cleanse macros in your workflow, you do sacrifice performance. Think of it as cleaning the house with a toothbrush and a cup of water. I am offering you a mop and a bucket. Make your workflows run faster and give others a chance to use the shared resources. If you're working with large sets of data, this macro upgrade is essential.</i><br /><br />Alteryx Community Post: <a href="https://bit.ly/34mfA0U" target="_blank">https://bit.ly/34mfA0U</a><br /><p></p><p>Presentation (YouTube) on this macro can be found here: <a href="https://youtu.be/kIDqnwT4g5Q" target="_blank">https://youtu.be/kIDqnwT4g5Q</a> </p><p>Walk-thru (YouTube) of macro can be found here: <a href="https://youtu.be/uA5oyfmE2uc" target="_blank">https://youtu.be/uA5oyfmE2uc</a></p><p>Cheers,</p><p>Mark</p><p><br /></p><p style="background-color: white; box-sizing: border-box; color: #3e3e3e; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 14px; margin: 0px; outline: none;"><br /></p><p style="background-color: white; box-sizing: border-box; color: #3e3e3e; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 14px; margin: 0px; outline: none;"><br /></p><br /><br /><p></p>MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com3tag:blogger.com,1999:blog-5981114890639901811.post-46698821340879116942020-12-10T14:57:00.001+00:002020-12-10T14:58:52.165+00:00Building CReW Generate Dummy Variables<h2 style="text-align: left;">Background:</h2><p>This story goes back to the 1980's when I was asked to test new bank software and to document what errors I uncovered. I completed an Error Incident Report and walked that form to the next building for review by the development manager. Finding errors meant that I got to leave my windowless cubicle and walk in the California sunshine (at least temporarily). The developers needed to know what process they would need to perform to recreate the incident and what the expected results of such actions should be. Upon return to my desk, I would have to summarize the days findings and explain back to the project management what issues were found and what their potential impacts would be on the bank's production environment if left unresolved.</p><p>The tried and true waterfall development process left testing until after the requirements and design were completed and I eagerly awaited software to find what were sure to be plenty of bugs. The biggest contention was whether the "expected" results were well defined in the requirements because I would report "errors" that could be considered as missed requirements.</p><p>Creating a CReW macro does not include requirement documents, design specifications, use cases, or an approval process. In my, Mark's, POV I create what I think captures the essence of a design pattern (assembly of Alteryx tools) into a single tool. Some of these patterns are fairly simple and straight-forward and reduce the time to configure multiple-tools and some patterns are difficult for beginners to gain the concepts for. In either case, the tool obfuscates the pattern and makes something easier for the user.</p><p>As an Alteryx ACE, I'm able to attend developer days where we have an opportunity to share feedback with the development (sometimes with product managers) team and discuss our views and needs as well as to give our feedback on their ideas. Observant as I am to the NDA, that's where that story ends and this macro blog begins.</p><h3 style="text-align: left;">Let's talk Cross Tab"</h3><p>Who doesn't like a Cross Tab tool? Frankly, I don't know why it is a <b>"Cross Tab"</b> tool and isn't a <b>"Crosstab"</b> tool. There are more than 200 ideas in the Alteryx Community returned when you query that term where 1/3 of these ideas are authored by Alteryx ACEs. Just because there are literally hundreds of ideas posted, doesn't mean that the tool is broken. It means that improvements are requested. The cross tab tool is at the heart of the create dummy variables process and this process was the topic of my latest rant to Alteryx.</p><h4 style="text-align: left;">Cross Tab - Areas of potential improvement</h4><p></p>Here are a few of my personal grievances:<br /><ul style="text-align: left;"><li>Configuration is not saved as some new tools do</li><li>Dropdown and select are not searchable</li><li>Domain/headers replace non-alphanumeric characters with underscore</li><li>Output columns are in alphabetical order</li><li>You need data that supports all possible values otherwise Output columns are not generated</li><li>Downstream tools fail if not run with sufficient data</li></ul><p></p><h4 style="text-align: left;">Cross Tab - Work-arounds</h4><p></p><ul style="text-align: left;"><li>Use a find replace tool to prepend a sort sequence to each field value (to change the incoming data) so that the column name sorts data (e.g. 00_Sunday, 01_Monday). Later I can dynamically rename the columns</li><li>Use an Ensure Fields (CReW) macro to create needed columns of data (after Cross Tab). </li><li>Place a select in front of the cross tab. Only bring a minimum amount of fields into cross tab. Join back on either record sequence or recordid depending on need (e.g. use of AMP or if output records aren't 1:1 to input)</li><li>Sample the output data (0 records) and save to YXDB. This saves the metadata for a good output. You can later Union this data within the workflow and ensure order and presence of data </li></ul><h3 style="text-align: left;">Let's talk Dummy Variables</h3><div>After my short (not so) rant, I realized that I should take on the challenge to improve Alteryx myself through the creation of the Generate Dummy Variables tool. It won't improve the Cross Tab, but does address the issues that take the greatest amount of my time when creating workflows that either model or score data. With 30 or more community posts on the subject, maybe it will help folks in the same boat as I am in.</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOkpfElk93KXA8woseeKHXSFNgR6_82C16woZCPsum5oJipT62xvXtfGrrzgnrpodU86hKODgawjNii8WTEo-NauOwogf0g8YeV5Uq2_YwCPbt6B-37eHJm0sAcbfj9_AypsQM22vMFv0c/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="450" data-original-width="800" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOkpfElk93KXA8woseeKHXSFNgR6_82C16woZCPsum5oJipT62xvXtfGrrzgnrpodU86hKODgawjNii8WTEo-NauOwogf0g8YeV5Uq2_YwCPbt6B-37eHJm0sAcbfj9_AypsQM22vMFv0c/" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlAnX4IVJfM_iHqoJoi4tyMqGlbuJZFQW3ZXnAHqvUliFraLuB4aQ4TWggrs4mRGfnoSbXOuBOxRlkzG29wwvLkzmDStckJRgZyJH7xQZ1aNr-8vHL_4ehkCPzn5Gb2yR7InphSPcC4rIa/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="507" data-original-width="1164" height="139" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlAnX4IVJfM_iHqoJoi4tyMqGlbuJZFQW3ZXnAHqvUliFraLuB4aQ4TWggrs4mRGfnoSbXOuBOxRlkzG29wwvLkzmDStckJRgZyJH7xQZ1aNr-8vHL_4ehkCPzn5Gb2yR7InphSPcC4rIa/" width="320" /></a></div><br /><br /></div><h3 style="text-align: left;">Defining Scope:</h3><div>Since I don't apply requirement documents or use cases to my CReW activities, I need to set boundaries for functionality and time to build. What can I create in a day? Yes, when I build a macro I hope to have it created in a day. That day generally spans for more than a week, but that includes blogs, builds, testing, feedback, documentation and icon selection. </div><div><br /></div><h3 style="text-align: left;">Scope for Dummy Variables:</h3><div>The scope is for a single variable (despite my knowledge that you may have multiple source fields to convert). I want to accept categorical data elements and provide the ability to rename the output columns to include the column name. If possible, I want to add the functionality of an ENSURE FIELDS macro (CReW), but not require the user to have that macro downloaded.</div><div><br /></div><h3 style="text-align: left;">Scope Creep:</h3><p></p><p>That idea to include the variable name as the first part of the output column name (e.g. Color_G) created a thought that a custom prefix might be preferred to the actual field name. Then I ran into problems with spaces (thank you Cross Tab) in the output column name field. When I added the ensure fields capability (to pretend that data values not present were accounted for), I had space problems and NULL value issues that needed more creativity. Finally, I was ready for testing and went to fellow ACE, <a href="Dan Languedoc" target="_blank">Dan Languedoc</a> for testing support. He suggested (insisted) that I allow for INT fields to be supported as categorical variables. "Fine!", I'll add them. He later said that my macro was indestructible.</p><h3 style="text-align: left;">Development:</h3><div>I was unhappy with my final product. I felt that it wasn't easy to walk-through to explain to others and didn't feel satisfied with the macro. I had added functionality and had to ensure compliance in multiple locations of the workflow. It was not pretty. So I salvaged what I could and re-wrote the macro. It took me about an hour to come up with the current version.</div><div><br /></div><h3 style="text-align: left;">Testing:</h3><div>While I was building the macro, I was actively testing the macro in another workflow. I was using different configuration settings as well as different incoming data (e.g. things with and without spaces). When I want to see what's happening inside of the macro, I use a "debug" trick to place a Macro Output tool before and/or after a tool and look at the results in the secondary workflow. I can see what the data looks like going into and out of a dynamic rename or other tools that are in the middle of the workflow and can quickly reconnect them to another point of interest.</div><div><br /></div><h3 style="text-align: left;">Defensive Configuration or "APA Readiness":</h3><div>Will this macro fail in the future? I hope not. I hope that it works and that I never have to maintain or support it again. But what might be worse is to have consistently wrong results. The biggest risk that I saw was dropping or muliplying records. I use a TEST tool to ensure that the macro input record count exactly matches the output record count. If you drop a record (e.g. Create Points) and don't let the user know about it, I think that it is an error. I also added a check that if you ask to ENSURE field valuess that the macro will error if you don't actually input a field value. Also, if you copy/paste a field value into the ensured fields, if you don't mark it as required, that we will ignore the request. </div><div><br /></div><div>Now if the macro fails, we can all blame Dan. He said that it was good to go.</div><div><br /></div><div>P.S.: Here's a <a href="https://gallery.alteryx.com/#!app/CReW-Generate-Dummy-Variables/5fca958e0462d71998cd0aac" target="_blank">link</a> to the macro!</div>MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com36tag:blogger.com,1999:blog-5981114890639901811.post-69526437098255503182020-11-25T03:10:00.010+00:002020-12-02T14:50:45.596+00:00CReW For Dummies<p>New CReW macro is "ready". I'll be unveiling it at both the Twin Cities and Indiana user groups on December 10th and 11th (respectively). Here are the sign-up details (click to register) admission is free, pay at the door. Take the best seat, as we haven't any:</p><div class="event-item-name" style="background-color: #f0f0f0; box-sizing: border-box; color: #0082ca; cursor: pointer; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 14px; font-weight: 700; outline: none; text-transform: uppercase;"><a href="https://pages.alteryx.com/usergroup-tc-dec-q4.html" target="_blank">TWIN CITIES USER GROUP MEETING</a></div><div class="event-item-date" style="background-color: #f0f0f0; box-sizing: border-box; color: #4f4f4f; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 14px; font-style: italic; outline: none;">12/10/2020 12:00 pm - 1:30 pm CST</div><div class="event-item-location" style="background-color: #f0f0f0; box-sizing: border-box; color: #4f4f4f; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 14px; outline: none;">Virtual</div><p><br /></p><div class="event-item-name" style="background-color: #f0f0f0; box-sizing: border-box; color: #0082ca; cursor: pointer; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 14px; font-weight: 700; outline: none; text-transform: uppercase;"><a href="https://pages.alteryx.com/usergroup-indianapolis-q4-2020.html" target="_blank">INDIANAPOLIS USER GROUP MEETING</a></div><div class="event-item-date" style="background-color: #f0f0f0; box-sizing: border-box; color: #4f4f4f; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 14px; font-style: italic; outline: none;">12/11/2020 2:30 pm - 4:00 pm EST</div><div class="event-item-location" style="background-color: #f0f0f0; box-sizing: border-box; color: #4f4f4f; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 14px; outline: none;">Virtually, On24</div><p>I've updated this blog post with more hints about the macro. Because a picture is worth a thousand words, here's a picture of the macro:</p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXunLawSw6H8mO50Y0sNnbwFi50q5DRMb0DfNgtDMEsPtgs2ewF0TA_GGIEroBn4gCt0rWWxIi55L1R44KJ855I2Mg8rEtZ8fCkqZQlBITFF8-Y98E4FHy4-g8imsFcm6vIJ9cu4grjYl2/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="171" data-original-width="170" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXunLawSw6H8mO50Y0sNnbwFi50q5DRMb0DfNgtDMEsPtgs2ewF0TA_GGIEroBn4gCt0rWWxIi55L1R44KJ855I2Mg8rEtZ8fCkqZQlBITFF8-Y98E4FHy4-g8imsFcm6vIJ9cu4grjYl2/" width="239" /></a></div><br /></div><br /><br /></div><br /><p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKlc0L4AUdzLFtmMeZBYn5S-4xltQF_bg_bjIRpEY0-4HKQwJ6iXjuVa4GXzAypwTP1CxynSDPN7p9lAXs-wc7vDmd9FWS616yAXmFYvKEZ0Q3B1fqnpOzayW-3BOdTu95cBsEoyU474O4/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="457" data-original-width="980" height="186" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKlc0L4AUdzLFtmMeZBYn5S-4xltQF_bg_bjIRpEY0-4HKQwJ6iXjuVa4GXzAypwTP1CxynSDPN7p9lAXs-wc7vDmd9FWS616yAXmFYvKEZ0Q3B1fqnpOzayW-3BOdTu95cBsEoyU474O4/w400-h186/image.png" width="400" /></a></div><p><br /></p>If you'd like a further hint: Here's a blog post from the Alteryx Community that is good reading material in preparation for the release: <a href="https://community.alteryx.com/t5/Data-Science/Encoding-Variables-Translating-Your-Data-so-the-Computer/ba-p/445020">https://community.alteryx.com/t5/Data-Science/Encoding-Variables-Translating-Your-Data-so-the-Computer/ba-p/445020</a><br /><br /><p></p><p>Maybe you can join the virtual meeting and talk to me there? </p><p><br /></p><p><br /></p><p>Cheers,</p><p>Mark</p>MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com8tag:blogger.com,1999:blog-5981114890639901811.post-37213387247417390782020-02-23T11:02:00.000+00:002020-02-23T11:02:27.660+00:0010 Year Anniversary<br />
<div dir="ltr">
I know I've not been so active on this blog of late, but I realized the other day that it has now been 10 years since I started and I felt I needed a post to at least commenerate that occasion.</div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
And what a decade it has been. In 2010 I was a data analyst and Alteryx user a few months away from heading to a conference which at that point was called Extend The Reach, but in fact turned out to be the first ever Inspire.</div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
Ten years on and I am a Principal Software Engineer working for Alteryx and on my way to my 15th Inspire conference, which with the Analyticon rebranding might turn out to be the very last.</div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
To say this software has changed my life would be an understatement. But 10 years on I still love this product as much as I did when I first started using it. Last week I requalified for my advanced certification and enjoyed the thrill of once more using the product against the clock.</div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
I look forward to catching up with all of you who will be in Sydney this week. I'm still excited as ever about Inspire and the people and challenges I will meet in the solution centre.</div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
Adam</div>
<br />Adam Rileyhttp://www.blogger.com/profile/02560079966812151991noreply@blogger.com7tag:blogger.com,1999:blog-5981114890639901811.post-42410166305282742462020-02-10T16:41:00.000+00:002020-02-10T21:04:28.150+00:00Building a Better Record ID tool ... <div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_g7gyx2tWGPFMsuG6g2na2nJzwNOjKWVyqqdIDQAbNXIdxkB-t6NRZ46jDY6YJgl0sXV2rOD0ECLoHpeYmkNCQe5rSPng8N04vjRvXtepggKMzGLLJ8Yt536w7djH-wyc2mRSVmybsGeZ/s1600/York+Ghost+Merchants.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="640" data-original-width="480" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_g7gyx2tWGPFMsuG6g2na2nJzwNOjKWVyqqdIDQAbNXIdxkB-t6NRZ46jDY6YJgl0sXV2rOD0ECLoHpeYmkNCQe5rSPng8N04vjRvXtepggKMzGLLJ8Yt536w7djH-wyc2mRSVmybsGeZ/s320/York+Ghost+Merchants.jpg" width="240" /></a></div>
<br />
Whilst visiting the Shambles in York, I was treated to a set of ACE inspired ghosts from my friend and fellow ACE, Rafal Olbert. We searched the community of ghosts at the Ghost Merchant for the perfect trio of goblins to complete the set. If you notice the coloring, they closely resemble the ACE logo on Raf's polo. Who except us would spend the time rummaging through hundreds of ghosts to complete this task?<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://pvsmt99345.i.lithium.com/html/assets/ace_program_RafalOlbert.jpg?C39A410D4ECD530F6FA3662F0800B5EB" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="705" height="320" src="https://pvsmt99345.i.lithium.com/html/assets/ace_program_RafalOlbert.jpg?C39A410D4ECD530F6FA3662F0800B5EB" width="282" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Now comes the question that you might be asking, "What does this have to do with CReW macros?" It has everything to do with them. Often there will be a simple task that has to be configured by many in the community. The time spent in configuring a task could be better spent elsewhere (e.g. visiting York with friends).</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
There are multiple posts in the Alteryx Community asking how to get unique record IDs on groups of records. There are also multiple ideas in the community to modify the functionality of the RecordID tool. James Dunkerley presented at Inspire 2020 on the magic of modifying XML. One example that he showed was the adding of the grouping functionality to the Record ID.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
I grabbed a copy of his macro and have had it waiting for an opportunity to release it to the CReW user-base. If you think about the construction of a macro that allows for GROUPING, you'll realize that the dynamic nature of grouping requires you to build a solution that allows for multiple (any) selections of fields from the incoming data stream. James solved the grouping by modifying the XML in a formula:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both;">
<span style="background-color: #f3f3f3; font-family: "courier new" , "courier" , monospace;">IIF(IsEmpty([#1]) OR [#1]='""', "<GroupByFields />", </span></div>
<div class="separator" style="clear: both;">
<span style="background-color: #f3f3f3; font-family: "courier new" , "courier" , monospace;">'<GroupByFields><Field field=' </span></div>
<div class="separator" style="clear: both;">
<span style="background-color: #f3f3f3; font-family: "courier new" , "courier" , monospace;">+ Replace([#1], '","', '"/><Field field="')</span></div>
<div class="separator" style="clear: both;">
<span style="background-color: #f3f3f3; font-family: "courier new" , "courier" , monospace;">+ '/></GroupByFields>')+ "/*" + [#1] + "*/"</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
He's modifying the XML of a standard Multi-Row Formula to update the GROUP BY parameter. When no fields are selected, the resulting xml (grouping) looks like this:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "courier new" , "courier" , monospace;"><span style="background-color: #f3f3f3; color: blue;"><GroupByFields /></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
If the incoming data has three (3) fields selected for grouping, the results need to look like this:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="background-color: #f3f3f3; font-family: "courier new" , "courier" , monospace;"><span style="color: lime;"><</span><span style="color: blue;">GroupByFields</span><span style="color: lime;">></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "courier new" , "courier" , monospace;"><span style="background-color: #f3f3f3;"> <span style="color: lime;"><</span><span style="color: blue;">Field field=</span><span style="color: red;">"Field1"</span> /<span style="color: lime;">></span></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="background-color: #f3f3f3;"><span style="font-family: "courier new" , "courier" , monospace;"> </span><span style="font-family: "courier new" , "courier" , monospace;"><span style="color: lime;"><</span><span style="color: blue;">Field field=</span><span style="color: red;">"Field2"</span> /<span style="color: lime;">></span></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="background-color: #f3f3f3; font-family: "courier new" , "courier" , monospace;"> <span style="color: lime;"><</span><span style="color: blue;">Field field=</span><span style="color: red;">"Field3"</span> /<span style="color: lime;">></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="background-color: #f3f3f3; font-family: "courier new" , "courier" , monospace;"><span style="color: lime;"></</span>GroupByFields<span style="color: lime;">></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The macro is configured to read the incoming metadata and will populate a LIST BOX interface tool with all of the incoming fields. When the user selects the fields (e.g. Field1, Field2, Field3), the question results are passed to an ACTION tool as a comma delimited series of values. James then creates a formula to modify the output to produce the XML component displayed above.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<i>If James had attended the BUILD 2 event in Nashville, this was one of the challenges posed. He would have won that event.</i></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
If you'd like to download a copy of the macro, it is in the Alteryx Gallery and can be found <a href="https://gallery.alteryx.com/#!app/CReW%2BGroupByRecordID/5e417bbf0462d70decb763a9" target="_blank">here</a> . Any feedback is welcomed.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Cheers,</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Mark</div>
MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com33tag:blogger.com,1999:blog-5981114890639901811.post-4590021878648408692020-01-30T09:11:00.002+00:002020-01-30T09:11:15.661+00:00Then Is Not Now<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqduGtcH63cT2V2idCyvoElw0YdvOhlt_s-RcSEBBtxt0NWxAaCp1Z-ayyziKBneEN9RYD8WoHNpvfyPWzESZ6je9_U-mrzxTT7e6IsKbVpSKo9wnMfwOj0XHwesk7v2ngJ0QomYSoYdaH/s1600/penny+lan+%25282%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="271" data-original-width="351" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqduGtcH63cT2V2idCyvoElw0YdvOhlt_s-RcSEBBtxt0NWxAaCp1Z-ayyziKBneEN9RYD8WoHNpvfyPWzESZ6je9_U-mrzxTT7e6IsKbVpSKo9wnMfwOj0XHwesk7v2ngJ0QomYSoYdaH/s320/penny+lan+%25282%2529.jpg" width="320" /></a></div>
<br />
I'm in the U.K. and visiting the Leeds Alteryx User Group. Just prior to my journey I had generated an idea for Alteryx to improve the generate rows tool: <a href="https://community.alteryx.com/t5/Alteryx-Designer-Ideas/Generate-Rows-Tool-Improvement/idi-p/519062" target="_blank">Please Read & Give Likes</a>. At the same time I suggested that if you: 1) click on a tool that is on your canvas & 2) go to the pallet and double-click a tool, that the tool will be inserted onto the canvas after the previous tool and that your cursor is moved to the configuration window <a href="https://community.alteryx.com/t5/Alteryx-Designer-Ideas/double-click-from-tool-pallet/idi-p/519060" target="_blank">Please Read & Give Likes</a>. But now I'm in Manchester and what have I done for CReW?<br />
<br />
With a little help from my friends, I decided to tackle joining to date ranges (<a href="https://community.alteryx.com/t5/Alteryx-Designer-Knowledge-Base/How-to-Join-on-a-Date-Range/ta-p/29332https://community.alteryx.com/t5/Alteryx-Designer-Knowledge-Base/How-to-Join-on-a-Date-Range/ta-p/29332" target="_blank">Tool Mastery: How to Join on Date Ranges</a>). The question comes up frequently in the community. What I did was simplify the GENERATE ROWS tool and make it create date or datetime intervals between two end date or datetime points.<br />
<br />
If you need to have a record for every day in 2020, you could feed it a start of 2020-01-01 and 2020-12-31 and get 366 output records. Note: I just tested and updated the macro. If you set the TYPE of the output field as datetime and try this, you'll only get 365 records. Thankfully, I caught this.<br />
<br />
So if you want a simple way to generate date records, please look to the Alteryx Gallery for the new macro. A link is provided below:<br />
<br />
<div style="text-align: center;">
<span style="font-size: large;"><a href="http://bit.ly/2UdTyZQ" target="_blank">CReW Generate Date Rows</a></span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Cheers,</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Mark</div>
MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com1tag:blogger.com,1999:blog-5981114890639901811.post-44346346469874618652019-10-18T14:13:00.000+01:002019-10-18T14:13:20.107+01:00<h2>
Run away!</h2>
<br />
A quick note as #Alteryx19 closed in London that should make for a great weekend. I've been told by Alteryx support that <span style="-webkit-text-size-adjust: auto; background-color: white; font-family: Calibri, sans-serif; font-size: 14.666666984558105px;">latest release of Designer 2019.3 – version 2019.3.5.17947 fixes the CReW Macro issue.</span><br />
<span style="-webkit-text-size-adjust: auto; background-color: white; font-family: Calibri, sans-serif; font-size: 14.666666984558105px;"><br /></span>
<span style="-webkit-text-size-adjust: auto; background-color: white; font-family: Calibri, sans-serif; font-size: 14.666666984558105px;">Cheers,</span><br />
<span style="-webkit-text-size-adjust: auto; background-color: white; font-family: Calibri, sans-serif; font-size: 14.666666984558105px;"><br /></span>
<span style="-webkit-text-size-adjust: auto; background-color: white; font-family: Calibri, sans-serif; font-size: 14.666666984558105px;">Mark</span>MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com1tag:blogger.com,1999:blog-5981114890639901811.post-45038623855755286642019-09-05T17:24:00.001+01:002019-09-20T19:01:03.035+01:002019.3 CautionThere are reported issues with the runner macros with 2019.3. Alteryx has been alerted to the issue. At this time I recommend reverting to 2019.2 until Alteryx has an update for us. If you're not using the runner macros, enjoy the many new features.<br />
<br />
For more information please reference the linked <a href="https://community.alteryx.com/t5/Alteryx-Designer-Knowledge-Base/CReW-Macro-Support/ta-p/465740" target="_blank">Alteryx Community article</a>.<br />
<br />
Cheers,<br />
<br />
MarkMarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com2tag:blogger.com,1999:blog-5981114890639901811.post-24756922845686795542019-08-30T14:30:00.001+01:002019-08-30T14:30:39.945+01:00Dynamic Formula: A performance use caseIn the Alteryx Community a post caught my attention. The member wanted to perform calculations based upon the previous field (column). For the purpose of this post, I've modified the use case as follows:<br />
<br />
<blockquote class="tr_bq">
Within my Alteryx workflow I need to calculate the difference between each numeric column of data (e.g. monthly data) and create "delta" columns that calculate that difference. Success of the solution depends upon both not needing to update the workflow (e.g. dynamic calculations) and the performance of the solution (not needing to transpose the data).</blockquote>
My friends Thales & Esther (<span class="login-bold" style="background-color: white; box-sizing: border-box; color: black; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 14px; font-weight: bold; outline: 0px; white-space: nowrap;"><a href="https://community.alteryx.com/t5/user/viewprofilepage/user-id/49596" target="_blank">Thableaus</a> & </span><span style="background-color: white; color: #5a61c5; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 14px; font-weight: 700; white-space: nowrap;"><a href="https://community.alteryx.com/t5/user/viewprofilepage/user-id/6304" target="_blank">EstherB47</a>) </span>recommended transposing the data.<br />
<br />
<blockquote class="tr_bq" style="background-color: white; box-sizing: border-box; color: #3e3e3e; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 14px;">
When dealing with this kind of situation, the best you could do is to transpose your columns into rows.<br />This way you can work with Multi-Row Formula, that can be much more flexible in regards to what you're looking for.<br /><br />So basically use Transpose Tool and you'll have a better situation to compare previous records against the current ones.</blockquote>
Not me! I know how to avoid the transpose tool and how to dynamically calculate formulas. Try this yourself and don't use a Transpose Tool or Multi-Field Formula. Imagine hundreds of columns with thousand or more rows. Here's some simple input data:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhHdq5Hi8FQzaWhq2W7mB-cMD_6U0-ubfNmIrHbWSmIyJCNOYXP3IdsEhh9s66Q9wvXkrwlK7nUO5MNRuobtgW8R3363_EAwPVg4qAh6IDeF9Zgrud24S7DkqWsd0SyBDFpq997bozx72l/s1600/capture.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="85" data-original-width="864" height="60" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhHdq5Hi8FQzaWhq2W7mB-cMD_6U0-ubfNmIrHbWSmIyJCNOYXP3IdsEhh9s66Q9wvXkrwlK7nUO5MNRuobtgW8R3363_EAwPVg4qAh6IDeF9Zgrud24S7DkqWsd0SyBDFpq997bozx72l/s640/capture.jpg" width="640" /></a></div>
<br />
This is the desired output:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ0Ifn52mDTFz0apIQIanGBtBVFh-k5ofPoJaKltbK459O32_Z1FsMYO9SR5me061ox8TLF1jGdGiTKAmFhp5_5UHibW-cGv20BUppezcgZMsrRAwVZwPKOIw3HGsF9HnELMlBXohJf8Oz/s1600/capture.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="123" data-original-width="1600" height="48" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ0Ifn52mDTFz0apIQIanGBtBVFh-k5ofPoJaKltbK459O32_Z1FsMYO9SR5me061ox8TLF1jGdGiTKAmFhp5_5UHibW-cGv20BUppezcgZMsrRAwVZwPKOIw3HGsF9HnELMlBXohJf8Oz/s640/capture.jpg" width="640" /></a></div>
<br />
<br />
The solution looks like this:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnn2fEKflVaqWSPPdSYVS-EEkTRlkH83P_tin5kPRaxRrMs1iIEA18kYnJpyhd3IK9KrkL6d2Y0QRv7Cdo5lwLpFivXZt0f0vCXQ5qHNZoWB_0uUDMsYr-YXtYpjySRZij1ueFGIp3eDif/s1600/capture.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="834" data-original-width="1600" height="333" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnn2fEKflVaqWSPPdSYVS-EEkTRlkH83P_tin5kPRaxRrMs1iIEA18kYnJpyhd3IK9KrkL6d2Y0QRv7Cdo5lwLpFivXZt0f0vCXQ5qHNZoWB_0uUDMsYr-YXtYpjySRZij1ueFGIp3eDif/s640/capture.jpg" width="640" /></a></div>
<b>Step 1:</b> Use a SELECT tool to limit your input to just the "KEY" field(s) plus the numeric fields used in the calculation. I assume that the key is STRING.<br />
<b>Step 2:</b> Use a FIELD INFO tool to get the metadata (names & types) of incoming data.<br />
<b>Step 3:</b> Use a FILTER tool to remove any non-numeric fields. If the KEY is numeric, we're going to have a problem. You'd need to use a SAMPLE tool to skip N records (N is the number of key fields).<br />
<b>Step 4:</b> Configure a FORMULA tool to create "Output Field" names for each of the new fields.<br />
<b>Step 5:</b> Configure a MULTI-ROW Formula tool to create an expression of:<br />
<blockquote class="tr_bq">
"[" + ToString([Name]) + "] - [" + ToString([Row-1:Name]) + "]"</blockquote>
<b>Step 6:</b> Use a sample tool to remove the calculation of Delta from the first record.<br />
<b>Step 7:</b> Configure the CReW Dynamic Formula tool.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMl0j7WMhGI9BjpYZ7ElKKPBpnpm4j7N2jSZEsTRmpVXCTC0_OvqbZsSQFijp_UcCLPy9_KpkfyyJPdZtmhA-GGgsgJlIcbCWWAk_L8TkkgzdD1Yt8M-pyGz2OioBRw6d8lnf7AGnOWg3n/s1600/capture.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="249" data-original-width="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMl0j7WMhGI9BjpYZ7ElKKPBpnpm4j7N2jSZEsTRmpVXCTC0_OvqbZsSQFijp_UcCLPy9_KpkfyyJPdZtmhA-GGgsgJlIcbCWWAk_L8TkkgzdD1Yt8M-pyGz2OioBRw6d8lnf7AGnOWg3n/s1600/capture.jpg" /></a></div>
The workflow has been saved within the Community post (above) and a link is available to the yxmd file (<a href="https://community.alteryx.com/pvsmt99345/attachments/pvsmt99345/designer-discussions/89450/1/Multi-Field%20via%20Dynamic%20Formula.yxmd" target="_blank">here</a>).<br />
<br />
This might make for a clever CReW macro addition. Is there a volunteer to prototype a generic macro for the community?<br />
<br />
Cheers,<br />
<br />
Mark<br />
MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com2tag:blogger.com,1999:blog-5981114890639901811.post-36452985624080457682019-06-20T14:34:00.001+01:002019-06-20T14:34:25.255+01:00#Alteryx19 - Nashville: We turned it up to Eleven!<h2>
Can you CReW with the best?</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPfDfGsQ4rzna4h2WiQ-M-BrSxvYwiFBbO5j0iIctzZ_yjZ1lw98bP84c7fVIzoie-_MBB1M8jPoxyRIpGSaZFUr0hoUcgsxoDzeEOHeHySPhJAwM-9Sti9U7Dho6I8o34DpGUmaz42MiR/s1600/CReW+Nashville.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPfDfGsQ4rzna4h2WiQ-M-BrSxvYwiFBbO5j0iIctzZ_yjZ1lw98bP84c7fVIzoie-_MBB1M8jPoxyRIpGSaZFUr0hoUcgsxoDzeEOHeHySPhJAwM-9Sti9U7Dho6I8o34DpGUmaz42MiR/s320/CReW+Nashville.jpg" width="240" /></a></div>
<div>
<br /></div>
<div>
As part of #Alteryx19 we conducted not one, but two sold out CReW macro training classes. With the assistance of <a href="https://twitter.com/TessaEnns" target="_blank">@TessaEnns</a> we demonstrated how to gain productivity through the use of CReW macros. We delved into some alternative methods for getting to the same results, how to open and investigate the macros along with how to get involved with CReW.</div>
<div>
<br /></div>
<div>
Tessa drove and I was the navigator and tour guide for the sessions. There were some twists and turns as we fielded questions from the class participants. We explored existing and new use cases that included questions like: "How can you make the DISTANCE tool execute faster when applying TomTom drive time distances?" Our answers included options of: Don't use it when you've previously calculated that distance (save your results), Overlay a grid to your catchment (trade) area and calculate the distance/times from the center of each grid rather than from the specific household address, Amp up your memory.</div>
<div>
<br /></div>
<div>
Upon return from Nashville, we've added 5 short YouTube videos explaining the following macros:</div>
<div>
<br /></div>
<div>
<a href="https://youtube.com/video/g4lN92sXZlY" target="_blank">Parallel Block Until Done</a></div>
<div>
<a href="https://youtube.com/video/Qncxonr8QkY" target="_blank">Blocking Test</a></div>
<div>
<a href="https://youtube.com/video/S1Hkiw1SOXo" target="_blank">Expect Equals</a></div>
<div>
<a href="https://youtube.com/video/I45UpLqXhSY" target="_blank">Add Totals</a></div>
<div>
<a href="https://youtube.com/video/xewrsLMYTKM" target="_blank">Ensure Fields</a></div>
<div>
<br /></div>
<div>
If you haven't yet subscribed to my (<a href="https://www.youtube.com/channel/UC8ELS4rnehKRmAJ6wC28hfw" target="_blank">MarqueeCrew</a>) YouTube channel, please do so.<br />
<br />
There's been lots of discussion about incorporating CReW functionality into the Alteryx product. It's no secret that many of the macros would benefit the product and make it easier on new and existing members of #AlterNation. These ideas have been officially posted to Community and your vote (star) couldn't hurt:<br />
<br />
<a href="https://community.alteryx.com/t5/Alteryx-Designer-Ideas/Elevate-Crew-Macro-Pack-support-from-Community-based-to/idi-p/113467" target="_blank">Elevate Crew Macro Pack support from Community based to Officially Supported</a><br />
<a href="https://community.alteryx.com/t5/Alteryx-Designer-Ideas/Can-we-add-some-of-the-CReW-tools-and-JDunkerly-formulae-to-the/idi-p/58073" target="_blank">Can we add some of the CReW tools and JDunkerly formulae to Alteryx</a><br />
<br />
Even if Alteryx brings all of the macros to life within the product, we'll likely still be here as a proving ground for new innovation. As a Minimum Viable Product (MVP) or better, the CReW macros assist in making Alteryx more useful and easier to configure.<br />
<br />
Hidden in plain view (at the end of this blog) is a note of caution. It has come to our attention that the Runner Macros do not run on computers with Windows 10 Enterprise. If you have overcome this obstacle, please let me know. There are several posts on community about this and we don't currently have plans to address the functionality.<br />
<br />
At Inspire we discussed as part of Build2 the creation of new macros. Maybe you've already created one of these macros:<br />
<br />
<br />
<ul>
<li><b><u>Summary Append:</u></b> Merge the functionality of a Summary and Join tool to apply grouping logic and put the result of the summation (e.g. Total by Group) on each incoming record.</li>
<li><b><u>Record-Row ID:</u></b> Extend the RecordID tool to allow to reset to a starting value (e.g. 1) for every record within a group or set.</li>
</ul>
<div>
If you have feedback on these or other ideas, please comment in the blog or reach out to me directly.</div>
<div>
<br /></div>
<div>
Cheers,</div>
<div>
<br /></div>
<div>
Mark</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com8tag:blogger.com,1999:blog-5981114890639901811.post-41042990902731401532019-01-14T01:42:00.001+00:002019-01-14T01:42:28.756+00:00Block All Records<h1>
Block All Records<o:p></o:p></h1>
<div class="MsoNormal">
Hold the presses!<span style="mso-spacerun: yes;"> </span>The
first Alteryx Certified Expert, Jesse Clark has contributed to the CReW
macros.<span style="mso-spacerun: yes;"> </span>There is simplicity here for all
to learn from.<span style="mso-spacerun: yes;"> </span>But first, why block all
records?<span style="mso-spacerun: yes;"> </span>I know that I’ve used the
function many times, but how about you?<span style="mso-spacerun: yes;">
</span>Have you ever wanted to stop all data from being output?<span style="mso-spacerun: yes;"> </span>Essentially, you want to sample zero
records.<span style="mso-spacerun: yes;"> </span>Oh! That makes everything so
clear.<span style="mso-spacerun: yes;"> </span>Maybe if I suggest a use case,
this will make more sense.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
You have an input dataset and want to make sure that the output
of your process (e.g. macro) contains all of the fields in the same order as
the original file.<span style="mso-spacerun: yes;"> </span>You could use the
Block All Records macro and stream that into a UNION tool.<span style="mso-spacerun: yes;"> </span>Then set the UNION to read #1 first.<span style="mso-spacerun: yes;"> </span>It is then up to you whether you will
auto-configure by Name or manually configure the data.<span style="mso-spacerun: yes;"> </span>The bottom line is that the incoming data
fields are in the same order on output.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Another example use case is where you have a list of files
that you’ve already read.<span style="mso-spacerun: yes;"> </span>If you read
this list into a process looking for new files (JOIN with Left output), you
might one day want to ignore all read files and rerun the whole set of data.<span style="mso-spacerun: yes;"> </span>If you Block All Records, then you’ll end up
processing all data as new.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Thanks Jesse for the contribution!<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Link: https://gallery.alteryx.com/#!app/CReWBlockAllRecords/5c3be83f8a933709d4b7f66d</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Cheers,<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Mark<o:p></o:p></div>
MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com1tag:blogger.com,1999:blog-5981114890639901811.post-30974800823357967132018-11-05T21:04:00.003+00:002018-11-05T21:04:34.554+00:00<w:sdt docpart="DE0DAC7B9B72438CBB745B22B72A949A" id="89512082" storeitemid="X_5F329CAD-B019-4FA6-9FEF-74898909AD20" text="t" title="Post Title" xpath="/ns0:BlogPostInfo/ns0:PostTitle">
</w:sdt><br />
<div class="Publishwithline">
<span style="font-size: large;"><br /></span></div>
<div style="border-bottom: solid #C6C6C6 1.0pt; border: none; mso-element: para-border-div; padding: 0in 0in 2.0pt 0in;">
<div class="underline">
<o:p><span style="font-size: large;">Trick or Treat: Find Closest </span></o:p></div>
</div>
<div class="PadderBetweenControlandBody">
<br /></div>
<div class="MsoNormal" style="background: white; margin-bottom: .0001pt; margin-bottom: 0in;">
<span style="color: #3e3e3e; font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">I've been tinkering with spatial requirements
from clients and have found myself inside of a rabbit's hole. The result
was the creation of a new macro, <b><a href="https://gallery.alteryx.com/#!app/Find%2BClosest/5be0aeeb826fd30cc84f635f" target="_blank">Find Closest</a></b>. </span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV3MI9NkI585yrocJDo5EnQtoe4Sbti6Dk4X6l6oQgxrT-PC7arffhDqsqCgbe233Y1Nqog_UJAoOHgj9QnAPhj21snDhIaU0CqsAIgjgzlaEUIBBry0oraBEomk6_quYGsXKA2HfwXY3M/s1600/Find+Closest.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="301" data-original-width="301" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV3MI9NkI585yrocJDo5EnQtoe4Sbti6Dk4X6l6oQgxrT-PC7arffhDqsqCgbe233Y1Nqog_UJAoOHgj9QnAPhj21snDhIaU0CqsAIgjgzlaEUIBBry0oraBEomk6_quYGsXKA2HfwXY3M/s200/Find+Closest.png" width="200" /></a></div>
Unlike the Distance Tool, the Find Closest macro calculates distances without the need of a spatial object. In speed comparisons, this macro is 100 times faster than the distance tool. This macro also differs from the Alteryx Find Nearest tool as it does not use the spatial or drivetime functions for calculating distances. Underneath the covers it uses the <a href="https://en.wikipedia.org/wiki/Haversine_formula">Haversine formula</a>
for calculation of distances on a sphere. Although the earth is
flattened, it does very well for calculation of distances. It is
virtually exact on what would be a trade area. I've shown this macro and
formula to a few ACE friends <a href="https://community.alteryx.com/t5/user/viewprofilepage/user-id/718"><span style="color: #0082ca;">@andy_moncla</span></a> and <a href="https://community.alteryx.com/t5/user/viewprofilepage/user-id/4584"><span style="color: #0082ca;">@Treyson</span></a> for their opinions and have had
positive feedback. I am going to release it via the Alteryx Gallery as a
CReW macro with a caveat that the distances calculated may vary from those using
the Distance tool.<o:p></o:p><br />
<div class="MsoNormal" style="background: white; margin-bottom: .0001pt; margin-bottom: 0in;">
<br /></div>
<div class="MsoNormal" style="background: white; margin-bottom: .0001pt; margin-bottom: 0in;">
<span style="color: #3e3e3e; font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">This macro is simple, but offers features of “Distance”,
“Find Nearest” and “Create Points” tools in one macro.<span style="mso-spacerun: yes;"> </span>While reviewing a workflow with a large set
of customers and potential store locations, I was hoping to improve the
performance of the functions without the use of drivetime data.<span style="mso-spacerun: yes;"> </span>The client could then take the potential matches
through an API call to gather drivetime data (if needed) for the subset of “best”
records.<span style="mso-spacerun: yes;"> </span>Starting with a latitude and
longitude I was pleased to see the performance gains from a single formula
tool.<span style="mso-spacerun: yes;"> </span>After validation of the results I
wanted to make a general-purpose tool for the calculation of distances.<span style="mso-spacerun: yes;"> </span>With their needs in mind (note:<span style="mso-spacerun: yes;"> </span>The engagement had already been completed) I
started to think of how other analysts may benefit from a tool like this.<span style="mso-spacerun: yes;"> </span>Creation of the first prototype took roughly
4 hours to build, test and review.<span style="mso-spacerun: yes;"> </span>After
that, I tinkered with more user options and the creation of a macro image.<span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div>
<div class="MsoNormal" style="background: white; margin-bottom: .0001pt; margin-bottom: 0in;">
<br /></div>
<div class="MsoNormal" style="background: white; margin-bottom: .0001pt; margin-bottom: 0in;">
<b><span style="color: #3e3e3e; font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Description:</span></b><span style="color: #3e3e3e; font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal" style="background: white; margin-bottom: .0001pt; margin-bottom: 0in;">
<span style="color: #3e3e3e; font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">The find closest macro calculates the distance
between two sets of latitude & longitude coordinates. Given an input
stream of Target and Source locations it will calculate the distance between
all combinations of Targets and Sources. Optionally, it can accept a
stream of data that contains both the source and target coordinates (for
distance calculations only). When calculating via the dual inputs, it
allows the analyst to limit the distance output (matches) and can (if required
downstream) create spatial objects.<o:p></o:p></span></div>
<div class="MsoNormal" style="background: white; margin-bottom: .0001pt; margin-bottom: 0in;">
<br /></div>
<div class="MsoNormal" style="background: white; margin-bottom: .0001pt; margin-bottom: 0in;">
<b><span style="color: #3e3e3e; font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Features:</span></b><span style="color: #3e3e3e; font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<ul type="disc">
<li class="MsoNormal" style="background: white; color: #3e3e3e; mso-list: l1 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Inputs<o:p></o:p></span></li>
<ul type="disc">
<li class="MsoNormal" style="background: white; color: #3e3e3e; mso-list: l1 level2 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 1.0in;"><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Allows for either 1 or 2 input data streams<o:p></o:p></span></li>
</ul>
<li class="MsoNormal" style="background: white; color: #3e3e3e; mso-list: l1 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Distance Configuration<o:p></o:p></span></li>
<ul type="disc">
<li class="MsoNormal" style="background: white; color: #3e3e3e; mso-list: l1 level2 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 1.0in;"><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Ignore 0 Distance Matches<o:p></o:p></span></li>
</ul>
<li class="MsoNormal" style="background: white; color: #3e3e3e; mso-list: l1 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Find Closest Matches<o:p></o:p></span></li>
<ul type="disc">
<li class="MsoNormal" style="background: white; color: #3e3e3e; mso-list: l1 level2 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 1.0in;"><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Maximum Distance (Kilometre or Mile)<o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #3e3e3e; mso-list: l1 level2 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 1.0in;"><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Limit by quantity<o:p></o:p></span></li>
</ul>
<li class="MsoNormal" style="background: white; color: #3e3e3e; mso-list: l1 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Spatial Objects<o:p></o:p></span></li>
<ul type="disc">
<li class="MsoNormal" style="background: white; color: #3e3e3e; mso-list: l1 level2 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list 1.0in;"><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Optional creation of spatial object(s)<o:p></o:p></span></li>
</ul>
</ul>
<div class="MsoNormal" style="background: white; margin-bottom: .0001pt; margin-bottom: 0in;">
<b><span style="color: #3e3e3e; font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Benefits:</span></b><span style="color: #3e3e3e; font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<ul type="disc">
<li class="MsoNormal" style="background: white; color: #3e3e3e; mso-list: l0 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><b><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Speed</span></b><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">.
Tested on 1 million records this macro runs in </span><b><span style="color: #4472c4; font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman"; mso-themecolor: accent5;">under</span></b><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";"> <u>3 seconds</u> compared to </span><b><span style="color: red; font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">over</span></b><b><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";"> </span></b><u><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">12 minutes</span></u><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";"> using
spatial tools.<o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #3e3e3e; mso-list: l0 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><b><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Spatial Data</span></b><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">.
Because the distances are only "as the crow flies", no spatial
data is required (Find Nearest requires TomTom data).<o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #3e3e3e; mso-list: l0 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><b><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Create Points</span></b><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">.
Create points are NOT required. An option to create Target, Source
or Both points is available if needed downstream.<o:p></o:p></span></li>
<li class="MsoNormal" style="background: white; color: #3e3e3e; mso-list: l0 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in;"><b><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Output Miles</span></b><span style="font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">.
Both Kilometre and Mile distances are displayed on output.<o:p></o:p></span></li>
</ul>
<div class="MsoNormal" style="background: white; margin-bottom: .0001pt; margin-bottom: 0in;">
<b><span style="color: #3e3e3e; font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";">Notes:</span></b><span style="color: #3e3e3e; font-family: "Arial",sans-serif; font-size: 10.5pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
If you take a look under the covers of this macro you will
find the Haversine formula implemented using native mathematic expressions.<span style="mso-spacerun: yes;"> </span>Detours are used to avoid unnecessary functions
and as a last-minute addition, I added the use of a formula tool to create
spatial objects (if someone really wants them on output).<span style="mso-spacerun: yes;"> </span>If you haven’t discovered yet, you can perform
many spatial functions from within the formula tool.<span style="mso-spacerun: yes;"> </span>Please check out my YouTube <a href="http://www.youtube.com/watch?v=nZiL3WXQ8qA" target="_blank">video</a> that
demonstrates the raw power of this elegant beast in computing distances.<span style="mso-spacerun: yes;"> </span>If you haven’t yet subscribed to my <a href="https://www.youtube.com/channel/UC8ELS4rnehKRmAJ6wC28hfw?view_as=subscriber">YouTube
channel</a>, please do consider it.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
As always, your comments and feedback are welcomed. You can download the macro <a href="https://gallery.alteryx.com/#!app/Find%2BClosest/5be0aeeb826fd30cc84f635f" target="_blank">here</a>.<o:p></o:p></div>
<br />MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com0tag:blogger.com,1999:blog-5981114890639901811.post-18765553337796755942018-07-07T20:35:00.002+01:002018-07-08T13:09:19.024+01:00CReW Needs Your Opinion<h2 style="text-align: center;">
What's your opinion man?</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkv24oo0CEsqEgGewJaoGcyggvEhGvuCHfxP0VAT2-NzEat69FFCrHH2z2v2xEt2G7HIO2A48eVMkugXYOpiFCHMIpcehpGPpiEt2Xz6L5I4a_z-xXma_o0uPQVfphzFl1UZCH3WpuX-nh/s1600/BigLebowskiOpinion.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="200" data-original-width="267" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkv24oo0CEsqEgGewJaoGcyggvEhGvuCHfxP0VAT2-NzEat69FFCrHH2z2v2xEt2G7HIO2A48eVMkugXYOpiFCHMIpcehpGPpiEt2Xz6L5I4a_z-xXma_o0uPQVfphzFl1UZCH3WpuX-nh/s1600/BigLebowskiOpinion.gif" /></a></div>
<div>
<br /></div>
<div>
While conducting CReW macro training at Inspire18 with Joe Miller, we revealed several common use cases where the "Expect Equal (Beta)" macro was a solution. In fact, Joe Miller has begun incorporating the macro into his weekly challenges as a way of confirming the challenge results. We got a question from the class about this macro which I'm about to share: "Can you set which fields to check between the two files (instead of checking all fields)?"</div>
<div>
<br /></div>
<div>
What are your thoughts? My response was to "Select" the same fields from both sets of data for comparison prior to the macro. Adam was in the room and while I had asked him prior to the conference about why the "CReW Test" macros were still in Beta and his response was that he hadn't received any feedback on them from the Alteryx Community.</div>
<div>
<br /></div>
<h3>
Did you know?</h3>
<div>
<ul>
<li>Expect Equals requires every Field to be in the same order?</li>
<li>Expect Equals is case sensitive for Field Names?</li>
<li>Expect Equals is NOT case sensitive for data?</li>
</ul>
<div>
Are these bugs or are they features? I don't know. But I did have fun with some exploration. I wanted to create a CReW Delta macro. It would function similarly to the Expect Equal macro in that nothing happens when everything is equal. Above that, it would output every difference found for every record compared. It would also provide an error message explaining where the differences were found.</div>
</div>
<div>
<br /></div>
<div>
<div>
Error: CReW Delta (WIP) (3): <span style="color: red;"><b>There were 1 changed records found. 2 fields had differences: {Field4, Field5}. 1 unmatched left records and 0 unmatched right records.</b></span></div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguivUtXDW-xVSrx50TAIFs-4IBcC0v8pVOuYZMAO4mV8hxqPuAGiccrBbieYrjSnCu-VNeecrEnXbGI1Wz8d36xPFyn-1DfVOvDO4agoejMPU29RHwJttpo6VkJtZdS4c3Wkbe5KA3WUq-/s1600/capture.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="368" data-original-width="372" height="316" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguivUtXDW-xVSrx50TAIFs-4IBcC0v8pVOuYZMAO4mV8hxqPuAGiccrBbieYrjSnCu-VNeecrEnXbGI1Wz8d36xPFyn-1DfVOvDO4agoejMPU29RHwJttpo6VkJtZdS4c3Wkbe5KA3WUq-/s320/capture.png" width="320" /></a></div>
<div>
<br /></div>
<div>
In this macro, we compare records and output the Sequence number of each input file along with the field names where differences are found. The left and right value pairs are easily reviewed from the "Delta" output anchor.</div>
<div>
<br /></div>
<div>
This works wonderfully with 2 records. We wanted to explore the performance for millions of records. The number of records along with the number of fields compared will create challenges for computing resources. We experimented with 2 approaches for comparing the data and the results may surprise you.</div>
<div>
<br /></div>
<h3>
Approach #1: Do it like the CReW Expect Equal Macro</h3>
<div>
Transpose the data into Name + Value pairs and JOIN the results. When they match, do nothing and when they don't, then they are errors.</div>
<h4>
Pros & Cons:</h4>
<div>
<ul>
<li>You will be creating one (1) record for every field in the incoming data times the number of incoming records time two (2). Comparing 2 million records with 20 fields will result in 80 million comparisons. This seems to be a Con.</li>
<li>It is very easy to configure this macro. This seems to be a Pro.</li>
<li>We don't have an interface tool to allow you to select which fields to compare. This was a con for our CReW student.</li>
</ul>
<div>
<h3>
Approach #2: Use MD5 Hash on each record and compare the hash results</h3>
<div>
For each "selected" field on the incoming records, HASH the selected fields and compare the Hash value in a join that requires NO sort. Where the expected values differ, they are errors.</div>
<h4>
Pros & Cons:</h4>
<div>
<ul>
<li>You will be comparing one field for every record. This seems to be a Pro.</li>
<li>It is complex to create the dynamic formula to create the HASH function. This seems to be a Con (for our maintenance).</li>
<li>We included an interface tool to allow you to select which fields to compare. This was a pro.</li>
</ul>
<h3>
Results:</h3>
<div>
With 2 million input records (4 fields) approach #1 took roughly 10 seconds to complete. With the same input, approach #2 took roughly a minute to complete. Why did it take so long? Because the conversion of all fields to strings and the creation of the MD5 Hash was an expensive function to call. Sorting and handling small records was FASTER than creating the dynamic formula and hash.</div>
</div>
</div>
</div>
<div>
<br /></div>
<div>
Please take a look at the macro and let us know your thoughts. I appreciate your feedback and want to know if there are features or functions that you would want in this macro if we do decide to make it into a future release.</div>
<div>
<br /></div>
<h2>
Macro Location</h2>
<div>
<a href="https://gallery.alteryx.com/#!app/CReW-Delta--Alpha-/5b41141b826fd3116445fee8" target="_blank">CReW Delta (Alpha)</a></div>
<div>
<br /></div>
<div>
Cheers,</div>
<div>
<br /></div>
<div>
Mark</div>
<div>
<br /></div>
MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com0tag:blogger.com,1999:blog-5981114890639901811.post-42106364961724829362018-06-13T21:56:00.000+01:002018-06-14T11:58:56.718+01:00CReW - Who would cross the Bridge of Death must answer me these questions three<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAc8HYLWwBqwFKG-u3_XOl3msW7LBqecpsYigc1qnbXwwJEPNvy9MlDM26j4nricuFM2jWiNr35dyL04UgfmDLcrRbIKXrCtex03nI7SRkD9qjQQCha0m-JfxvJudPTxCXMQRt2JKkgLOE/s1600/capture.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="433" data-original-width="303" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAc8HYLWwBqwFKG-u3_XOl3msW7LBqecpsYigc1qnbXwwJEPNvy9MlDM26j4nricuFM2jWiNr35dyL04UgfmDLcrRbIKXrCtex03nI7SRkD9qjQQCha0m-JfxvJudPTxCXMQRt2JKkgLOE/s320/capture.png" width="223" /></a></div>
<span style="font-family: "arial" , "helvetica" , sans-serif;">#Alteryx18 marked the beginning of a journey for me. I've long been on this quest, but now take the lead as Adam focuses his efforts on family and Alteryx e2. My first CReW action was the creation of new SWAG. These die-cut stickers were gobbled up in Anaheim and I've reserved more for my friends at #Alteryx18 in Europe.</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">Second on my list of accomplishments was the assumption of the CReW Macro training (only scheduled in Anaheim for #Alteryx18). Together with Joe Miller from Alteryx we either wowed the attendees or we gave sufficient pleas for good survey results (9.6/10.0). Putting CReW macros to the "test" and opening eyes about how to create value from these gems really sunk home as users (beginner to expert) were enlightened by their seeming simplicity, but awesome results. "Oooohs and Aaaahs" abounded as we delighted the students with tips and tricks. Defensive configuration and use of CReW tools took center stage as Joe provided step by step instructions and I added colour to the session.</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyCpX4K-AysL4u28ynMeaHAiIY4C7pd_GMM3Gj92f6hZ_ORMrtc7rAui0Sp51i-O8AbY6-HRYZid7URBwIv1xwPxk98y-QsQJWo5aT-sbWlEBifQ_PFoqjnc_Jep2iXz8o3OYGw7hGBEyu/s1600/IMG_1452.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyCpX4K-AysL4u28ynMeaHAiIY4C7pd_GMM3Gj92f6hZ_ORMrtc7rAui0Sp51i-O8AbY6-HRYZid7URBwIv1xwPxk98y-QsQJWo5aT-sbWlEBifQ_PFoqjnc_Jep2iXz8o3OYGw7hGBEyu/s320/IMG_1452.JPG" style="cursor: move;" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji6IKt5VcfUYLs8wNZ5kDpBIbraT6DwPQYDyXAfYgdtaKBPlfGAyEYLVPjkGCFjjuzKu0oDg8QHdhNf6vnuCQmk1n31n851J-UKsfKiTNDxzU7ovJz3GA2glJGM9Ct_RmmneUPQI1ZFbK7/s1600/IMG_1456.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji6IKt5VcfUYLs8wNZ5kDpBIbraT6DwPQYDyXAfYgdtaKBPlfGAyEYLVPjkGCFjjuzKu0oDg8QHdhNf6vnuCQmk1n31n851J-UKsfKiTNDxzU7ovJz3GA2glJGM9Ct_RmmneUPQI1ZFbK7/s320/IMG_1456.jpg" width="240" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">Where do we go from here? I want to hear from you! What ideas and what needs do you have? I've created some beta macros (they are in the macro district of the Alteryx gallery), but CReW is more than just one person. Whether your an Alteryx guru or a newbie I can use your skills. Macros need naming, icons need designing, and we also need to manage the CReW inventory. Please let me know your thoughts and availability to join the CReW. </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">I'm very honored and excited to carry this torch. Join me and let's make Adam proud.</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">Cheers,</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">Mark</span>MarqueeCrewhttp://www.blogger.com/profile/06303687222813755735noreply@blogger.com0tag:blogger.com,1999:blog-5981114890639901811.post-75238472326918856412018-05-02T15:49:00.000+01:002018-05-02T15:49:36.545+01:00Passing The Baton<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD1KBu1I5RaZpAfFSYZb2x7814DrxtHJz0hzQALbMJNmZudm_9ldBxGLdeX5AT8v3KKoly9R78oWnf1r-7fdFcEUNXiDZkI6A4_dRZk6c1NozyZtmFrSlMWt2W9wW714nZwQl7pgWXW1A/s1600/ModuleRunnerBaton.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="171" data-original-width="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD1KBu1I5RaZpAfFSYZb2x7814DrxtHJz0hzQALbMJNmZudm_9ldBxGLdeX5AT8v3KKoly9R78oWnf1r-7fdFcEUNXiDZkI6A4_dRZk6c1NozyZtmFrSlMWt2W9wW714nZwQl7pgWXW1A/s1600/ModuleRunnerBaton.png" /></a>The theme of this year’s Inspire conference is “Alter Everything” and Alteryx has truly changed my life, it has brought me new friends, new skills, given me the chance to live on a different continent and through all of that the opportunity to build the product that I love.<br />
<br />
But times change, and with that said I am sad to announce that I am stepping down as the curator of the CReW macros. Which if I am honest I think already happened a couple of years ago, it has just taken me this long to realise it and make it official. There is no big reason, my life has just changed: I have a family who I want to spend my free time with and the time I don’t spend with them I want to get out of the house/office and exercise or see friends (and there is this little project at work I am working on that really eats up all of my thinking time right now). So apologies to everyone who has sent me bug fixes or new macros over the last couple of years and joined my list of “things I need to get to” I realise now I am not going to get to that list.<br />
<br />
But in thinking of what next for the CReW macros there really was only one person who I could think I might pass the reigns to (that pun just wrote itself). A long term contributor to the macros, a good friend and all round legend of Alteryx, Mr. Mark Frisch or as some of you may know him MarqueeCrew. I will let Mark post a welcome post here soon with his ideas for the macros, but all there is left for me to do is thank Mark for taking over and for all of you for all of your suggestions and help with the macros over the last 4 years.<br />
<br />
Hope to see many of you at one of the Inspire conferences this year.<br />
<br />
Adam<br />
(Former curator of the CReW macros)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOThVwEVSYXnoVdlKQyzf0AWJjraj9wSnvTBqOIHMFn7feALxVZsjUD9ddv8W_IKvrewa2j0NR7MI7b4QK-F8QToabK5oWoeyICCSH9zdEP2jjAT7NZp0vM3ADMd7S4EbkwHwveOj0DDM/s1600/IMG_0046.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="720" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOThVwEVSYXnoVdlKQyzf0AWJjraj9wSnvTBqOIHMFn7feALxVZsjUD9ddv8W_IKvrewa2j0NR7MI7b4QK-F8QToabK5oWoeyICCSH9zdEP2jjAT7NZp0vM3ADMd7S4EbkwHwveOj0DDM/s320/IMG_0046.jpg" width="240" /></a></div>
<br />
<div>
<br /></div>
Adam Rileyhttp://www.blogger.com/profile/02560079966812151991noreply@blogger.com1Cambridge, UK52.205337 0.1218169999999645452.1274775 -0.039544500000035454 52.2831965 0.28317849999996453