Episode Transcript
Available transcripts are automatically generated. Complete accuracy is not guaranteed.
Speaker 1 (00:00):
Welcome everyone to
another episode of Dynamics.
Corner Is nougat a candy in apackage.
I'm your co-host, chris.
Speaker 2 (00:09):
And this is Brad.
This episode was recorded onDecember 20th 2024.
Chris, chris, chris, finishingthe year, up coming into the
holiday season, I think of thatnougat, nougat in a candy.
It's a holiday candy, isn't it?
I think I don't even know.
You have to ask ChatGPT or someof these other models to see
exactly what a NuGet is.
(00:29):
But today we had theopportunity to learn all about
NuGet and how it can help abusiness central developer or an
ISV within the lifecycle of theapplications.
Speaker 1 (00:43):
With us today, we had
the opportunity to speak with
Chris Krieg.
I was going to make a commentthat Chris Krieg sounds like
Kris Kringle.
I was going to say that duringthe episode who brought in a
candy called Nougat on aChristmas gift.
Speaker 2 (01:06):
Good afternoon, good
morning.
How are you doing, sir?
Great, how about you?
Excellent, excellent.
I'm a little tongue-tied thismorning for some reason.
I guess it's just.
Speaker 1 (01:15):
It's Friday, it's.
Speaker 2 (01:16):
Friday and for the
most of us.
Speaker 3 (01:18):
it's the last day
before Christmas, the last
birthday.
Speaker 2 (01:21):
Oh, yes, well,
unfortunately I'm not in that
camp, but me too I know a lot ofpeople with christmas following
on a wednesday and then newyear's eve following the
following week.
I know many people have, youknow, tried to sneak to get
those extended vacations.
You know, if you take mondayoff, I know a lot of places are
(01:42):
closed on the 24th or some, uh,close early.
So everyone's trying to getthose breaks in, or that two
week break, excellent, excellent.
How about yourself?
Are you doing anythinginteresting for the holiday
season besides working?
Besides working?
Speaker 3 (01:57):
No, I plan to do some
side project stuff and having
some time with my family overChristmas that's good, that's
important the family.
Speaker 2 (02:12):
Time is important.
Time in general is important.
I always say and I've been bigon this for a long time and
anyone who knows me closelyunderstands how I feel about
time where you spend your timeis what's important and where it
should be important, becauseyou don't get any time back.
Any minute that you spend doingsomething is a minute that you
spent doing something else, andyou, you, you know you can't
(02:33):
replenish the time that you havein life, so it's important to
spend doing this stuff.
And everybody says do what youenjoy.
Sometimes I enjoy working.
Right, it sounds crazy, butsometimes I'm working on
something you know from thedevelopment point of view.
Speaker 1 (02:45):
It depends what kind
of work you're talking about.
Speaker 2 (02:47):
Yes, and people say,
oh, you're working so much.
I'm like well, I enjoy itbecause I'm fulfilled doing what
I do.
I'm fortunate that I'm one thatenjoys what I do on a daily
basis.
Speaker 1 (02:57):
Well, that's your
purpose, right?
Sometimes purpose brings that.
Speaker 2 (03:01):
So is that really?
You know it factors into timeanyway, but I hope you have a
relaxing holiday season.
It's and also welcome back.
It's been a while since wespoke to you.
Speaker 3 (03:12):
Absolutely yeah.
Speaker 2 (03:14):
You know, last time
we spoke to you about some neat
things, you had a cool appsource app that's no longer
there because, I think you knowthey've added it to the AL
language.
Speaker 3 (03:23):
VS Code app.
Yeah, yeah.
Speaker 2 (03:25):
Yes, vs Code app
Excuse me not app.
Jeez, it's Friday.
So just right now, just forget.
This is why we don't do Fridays.
Speaker 1 (03:32):
We keep saying not to
do Fridays, but Fridays
sometimes kind of creeps intoour schedule.
Speaker 2 (03:39):
I think, because I
say we're not doing Fridays,
we're starting to have more andmore things scheduled on Fridays
because I have a couplerecorded calls today, on Friday,
so we'll see how that goes.
Yes, but yes, you had aninteresting VS Code app and I
saw recently that you introduceda new one for VS Code and that
(04:02):
opened up a whole can of I don'twant to say can of worms, but a
whole can of questions for me.
But before we get into that,would you mind telling everyone
a little bit about yourself?
Speaker 3 (04:13):
Yeah, sure, yeah, my
name is Christoph.
I'm founder of 365 BusinessDevelopment.
We are a small ISV in Germanyand we are focusing purely on
Business Central and developingsmall apps with the only idea in
mind to simplify work in BC.
(04:35):
So we are not creating somehuge extensions, apps, whatever
you call it, with a new I don'tknow contract management
functionality or whatever.
Oh, he had to go there.
Instead we are, we are justidentifying pain points, uh,
(04:57):
things which which are notperfect from our point of view,
and try to fill them and try tomake it easier for for BC
customers all over the world.
And, yeah, and that's why weare pretty much working with AL
(05:17):
and BC, of course, and that'swhy I step into a lot of things,
like, like last time we spoke,we see XML documentation stuff.
So I thought about how we canexpose our functionality to our
partners, to customers, to makethem understand how they can
adopt and how they can use it.
(05:38):
So XML documentation stuff isis created because I think we
need something like this, andMicrosoft came up, and now the
next one comes around the cornerand I think it could be pretty
cool for the community, andthat's why I started my next
side project.
(05:59):
No, I like that.
Speaker 2 (06:00):
And to go back to
what you're talking about, the
apps and that's something thatI've said with a lot of things,
that it doesn't always need tobe complicated.
Sometimes to be successful, youjust need to handle some of the
basics.
Process is sometimes a littlebetter than creating this whole
(06:23):
big thinking.
We need a big, robust system or, you know, complete module, as
you would, within theapplication to do, you know some
fancy things.
So I appreciate, uh, the appsthat you're developing, putting
out there in app stores to makethe use of business central
easier or different.
Speaker 3 (06:40):
I'm not sure that I
would agree with easy apps, but
but small one absolutely yeah,because, uh, because some, some
things were really challenging.
I I remember in back in 2022 Ithink, I had a, I had a
recording with steve aboutaddress validation and we dived
in into this little bit and thisis also a pretty small app, but
(07:02):
into this little bit and thisis also a pretty small app, but
it's in background it was reallytough to implement this and
also with direct printing andall this stuff we created.
On the surface it's just one,two pages and seamlessly
(07:25):
integrated into BC, but in thebackground it's much more.
Of course, it's like an iceberg, exactly.
Speaker 2 (07:33):
Well, I agree, small
to me and for clarification, go
back to easy for me does meanthe smaller apps, and I'm not
saying it takes away from thecomplexity of what it takes to
develop an app, but easy for acustomer to use to handle a
small, specific function is whatI shoot for with those smaller
apps.
So they're smaller,compartmentalized tasks in a
(07:55):
sense, or they do specificfunctions and they do those
functions very well.
See, that's what I've alwaysbeen told Do what you know and
do it well, right.
So you can't do everything.
So you have a new app withinthe visual studio, not app
source, but within the visualstudio marketplace.
I get confused and I think it'san interesting app.
What is that application thatyou released recently?
Speaker 3 (08:18):
um, yeah, first of
all, it's it's not I think it's
not just about the app, and theapp is relying on a lot of work
from other people, like Freddie,like Camille, which did a great
job, and basically it's allabout adopting NuGet to Business
(08:40):
Central and a lot of people, Ithink inc business, still don't
know what's what's new get isand basically it's kind of a
distribution feed for forpackages, for app files,
basically um or artifacts andand um with this, with the
(09:01):
introduction, introduction ofNuGet into BC, which came from,
as I said, freddie and Camille,I think in 2023, they brought a
whole new level of complexityinto our development, but also a
lot of opportunities.
Opportunities and we could useit.
(09:28):
I think it was in in summer of2023 and on bc tech days in
antwerp, where, where freddy andcamille presented this and we
could use it.
From from this point on it, itwas great, but actually nobody
does.
Nobody worked with it, becausea lot of people don't really
understand why should I use it,what's the benefit and how do I
use it.
Speaker 2 (09:48):
And, yeah, maybe we
have a little time to talk about
it and that's exactly whyyou're here, because when I hear
a NuGet and I know NuGet hasbeen around and you talked a
little bit about it's adistribution system I'd like to
talk a little bit deeply, alittle more deeper about that,
(10:10):
how it works, what it does and,even more so, how we can use it
within our business centraldevelopment process, our
development workflow.
I know NuGet's been around.
I've heard about it with otherapplication languages and it's
been around for quite a periodof time.
And you know, sometimes I heara NuGet, I think of like the
stuff within a candy bar, right,I think of like what do they
call that?
Is that NuGet, nugget, whateverthey call that stuff that fills
(10:32):
some of those chewy candy bars,but with that?
So let's just take it back astep.
So NuGet is a distributionsystem for packages.
Can we talk about that a littlebit deeper?
System for packages, can wetalk about that a little bit
deeper?
Like, how does it work?
You know we have thisdistribution system.
How does it get the information?
How does it work?
And then, even more so, if wecould progress into how your
(10:57):
application works or theextension that you wrote for
Visual Studio can be applied toa business central app.
There's a lot in thatconversation right there, so I
hope you have time.
Speaker 3 (11:03):
I have I have time,
of course Well.
So Nougat is basically astandardized format on how to
distribute artifacts, to be ascommon as possible, to
distribute artifacts formultiple platforms.
So it's very, very popular inC-sharp or NET, but it's
(11:27):
basically not focusing on onespecific language.
And what NuGet basically is isa server.
You can host it yourself.
You can use Azure DevOps, forexample, azure DevOps feeds,
which are also capable to serveas a NuGet server.
Or, of course, you can useNuGetorg to publish and
(11:53):
distribute your packages.
And what you are basicallypublishing is not just a pure
app file and I don't know, forexample, a manifest or something
like this.
I don't know, for example, amanifest or something like this.
It's a special package which iscalled NuGet package N-U-P-K-G.
Basically is a file suffix andinside of this package there's a
(12:19):
package manifest which saysokay, who's the publisher,
what's the identifier of thispackage, what's the name, what's
, what are the availableversions?
Uh, or which one, which is theavailable version right now,
which dependencies you have andand all this stuff.
And this is all pretty commonin in bc world as well.
(12:39):
So it was pretty natural to toadapt to this instead of we
invent the wheel and what thisbasically brings to our table.
I think it's not that importantto understand what NuGet
packages are.
That's why there are peoplelike Freddie, like Camille and
(13:00):
hopefully me, to serve thecommunity and provide tools you
just have to use.
But you don't really need tounderstand what's technical
inside of a NuGet package.
There are already cmdlets inbc-container-helper to create
(13:20):
NuGet packages to use thepreferred naming which Freddy
and Camille and some otherinvented.
Let's say it's this way becausein this case we are a little
special, because we have apublisher name.
This publisher name can changeover the versions.
(13:42):
We have an app name.
This app name can change itversions.
We have an, an app name.
This app name can change.
It's not a breaking breakingchange.
The only thing which needs toto stay forever is the app id
basically, and um, the app id isjust a good, so it's not very
friendly to search for an app idor something like this.
So they had to thought about,okay, how we name packages.
(14:04):
So even people and software canfind the packages.
And the big question isbasically, what can you do with
NuGet packages and what bringsNuGet to the table for BC
development?
And I think what's reallyimportant to understand is what
(14:27):
type of artifacts do we have inBC?
And basically we have threetypes.
We have the classic app filewith source code included.
We have runtime packages whichare pre-compiled for a specific
PC version and also alocalization, and we have
(14:50):
symbols and of course we allproduce.
If we work in VS Code and weclick package, it compiles a
regular app file with all thesource code included, the source
code, this app file is sent tothe server.
The server recompiles it and uh, or compiles it into into c
(15:10):
sharp and runs this on the onthe gc server.
Great runtime packages, as Isaid, are pre-compiled, so you
don't have to do this, thiscompilation process again.
But symbols are only references.
So symbols are basically if youextract the, the app file, it's
basically just a huge json filewhich has all the references
(15:30):
all over your application andand so on, and so by references,
you're talking about referencesto the methods to the object
the properties to the variables.
Speaker 2 (15:40):
Yes, so you can see
the structure without seeing the
code.
You can see the structure of anapp versus seeing the the
detail of it, so that you couldcommunicate with it, to use the
events, the methods and like,without having access to the
code or needing access toexactly and and basically the
symbols.
Speaker 3 (15:58):
We all know the
command download symbols, but
basically download symbols isnot always true.
So, as far as I know, if youdownload symbols from your own
BC container, for example, andyou have published the app with
all the source code, you get theapp file with all the source
(16:19):
code.
So it's not just the symbols,but basically the symbols are
just a JSON file, a huge JSONfile, and basically this is all
you need to develop in VS Codeand this is all you need to
compile your app with adependency to another app.
The only thing you need is thesymbols, and this is a pretty
(16:44):
interesting thing for ISVs andalso for Microsoft itself.
So let's start from anotherpoint.
When we start to develop a VSCode app, what do we need?
We need some kind of an BCinstance right now, because we
need to get the systemapplication, we need to get the
(17:07):
business foundation baseapplication.
All this stuff, all these weneed the symbols basically.
And every time you have torestore a certain container or
create a certain container in acertain version and maybe in a
certain localization, and thenyou download symbols and you try
to start coding.
And if you want to switch to Idon't know another version let's
(17:31):
say you support more than justone version you need to throw
away your container, create an Idon't know BC24 container and
do all this stuff again andagain and again and again.
Container and do all this stuffagain and again, and again and
again.
And I think I don't know howfast your computers are we are
(17:52):
working with, but I think youhave to at least wait five
minutes, I would say, for a newcontainer.
Yes, so so what?
Yeah, so what you're?
Speaker 2 (18:01):
referencing there,
just to bring it back, is if we
need to build an application fora different runtime or a
different version of BusinessCentral, we would need to create
a container with that version,publish our extension or
download the symbols for thatversion of the container.
See Friday, here we go.
So we download the symbols forthat version.
We would then package ourapplication built with the
(18:25):
symbols for the specific version, publish them to our container,
use the container helpercommand to get runtime packages.
Yes, it does take a few minutesbecause you would have to, even
with scripting all of that,because you can't script that
whole process, but it does taketime Processing time downloading
.
Yes, and creating the.
You know it downloads theartifacts to create the
(18:46):
container.
Then now you have to downloadyour symbols, build your
application, publish yourapplication, get the runtime
package.
Speaker 3 (18:52):
I think it might take
a little more than five minutes
, and you do that every singletime right, it might take a
little more than five minutesand let's be honest, at least
from my side.
I know I'm a lazy person,definitely.
And I have these containerswhich are three months old, four
months old maybe, so it's notthe latest version which I
(19:16):
develop against, and I don'twant to create it over and over
again, and it takes just toomuch time for me.
And so I thought about, withthe presentation from Freddy and
Camille, what maybe we can dowith all this NuGet stuff to
(19:39):
make this faster and to give methe opportunity to say okay, now
I want to work against bc24,next I want to use bc24.2 or
25.2 or whatever, and I justwant to select it, hit one
command and start working.
(19:59):
That was the basic idea.
I don't want to create acontainer over and over again.
To be honest, last year Istarted to work with Mac a
little more, so I had actuallythe problem I can't restore a
container to develop when I'mnot in the office.
Speaker 2 (20:17):
Smart choice.
By the way, that was a verysmart choice to move to Mac.
I'm not sure, but oh, we mighthave to end the conversation
early.
Speaker 3 (20:29):
You'll get there.
Maybe I need some more time.
Yeah, however, the containerstuff was really a problem for
me and I thought, okay, how canI solve this?
And the first idea which was apretty bad idea was to just
commit the AL packages folderinto my repository.
Speaker 2 (20:50):
Ah, bad idea.
Speaker 1 (20:51):
Cringe Really bad
idea, I just cringed.
Speaker 2 (20:53):
I just cringed when I
heard that, because talk about
wasted space.
I even share my AL packagefolder across projects and
workspaces because I only need a.
You know, I found one time on acomputer where someone had the
al packages for each project,never mind the workspace.
Right, you can.
You know the workspace has thesetting.
(21:14):
You can use the al packages andthen individual projects.
I think they saved after theygot rid of all of the al
packages and I showed them howyou can specify the folder and
share it, they saved.
I think it was like 17 gig orsomething.
Like it was an absurd amount ofspace that they were using just
with AL packages which, toChris's point, I call them
(21:36):
throwaway because you need todownload them for the version
that you're working with.
So if you're doing 25, then25.1, 25.2, you start building
all of those and then youmultiply that times all the
individual projects that you maybe working on.
It's a lot of space.
Speaker 3 (21:50):
But, as I said, I was
in the problem.
I had a Mac container thatdoesn't work.
Speaker 2 (21:56):
Oh, the Mac is not
the problem with having to check
in the same place.
Yeah, I know, don't try toblame the Mac.
No, no, no, no, no, but, no, no, no, no, no, no, but it was my
starting point.
Speaker 3 (22:09):
So it's just the
start of a journey.
Yeah, and, as I said, Irecognized very, very fast
that's not a good idea to do.
So I decided to dive into thisa little bit and, really fast,
came up with some PowerShellscripts and invoked nougat
directly and created nougatpackages, uh configurations to
(22:31):
to download the packages Ineeded, and it took some, took
some time, but at some point Isaid, okay, maybe, maybe it's
worse to to invest a little moretime into this and uh,
integrate this right into vscode.
And then I thought about okay,how you can do this?
(22:51):
And of course, I I look to the,to the big brother visual
studio, um, because there it's,it's already already there for I
don't know how many years, andit works.
It's intuitive.
So why not keep this as atemplate and try to do this in
(23:14):
VS Code as well?
And right before directions inhere, to be honest, because I
promised this on Twitter, sothat's why I was a little in a
hurry.
I just published the first twoor three preview versions, which
are already working but are faraway from perfect and far away
(23:38):
from, I would say, usable forproductive uh development.
But, um, the most importantthing for me is that it's not
just about about local vs codedevelopment.
When we start adopting to nugetand and and creating all the
(24:03):
artifacts the nugGet artifactslike the package config I told
about and put this into our repo, we got a whole new dimension
in DevOps or GitHub as well, soin our pipelines we can also
restore packages directly fromNuGet feeds and compile against
(24:25):
them, and it's super, super fast.
Speaker 2 (24:30):
So where that's
helpful then would be if you're
working on an extension withinAL an AL extension for VS Code
and you want to put it into apipeline, you no longer have to
get you know if you have adependency of another extension.
It could be from an ISV itcould be from Microsoft.
Speaker 3 (24:54):
At least two
extensions are always in place
it's a system app andapplication itself.
Speaker 2 (25:00):
So at least two
dependencies so that way you can
build based on it for aspecific version or even just
the latest version.
So by putting in the NuGet pathright to download the AE which
we can talk about how that worksin a moment.
So when you're going to build,you basically put a reference
for the dependency.
It will download the symbolsfrom the NuGet server, whichever
(25:25):
one you're using, that you hadmentioned, and use those
artifacts for you to package andbuild your extension without
having to download the symbolsyourself.
Speaker 3 (25:37):
And create a
container and as long as you
don't want to execute tests in,execute uh tests in it.
It's, it's fine and uh, what I?
What I tried as a someprototype it's not, it's not
ready yet for cicd purposes isback in the days.
(25:59):
We now have, I think, seven oreight apps and back in the days,
uh.
Well, right now, also, as aproductive, we run each and
every night, each and every uhapp against current, next minor,
next major, and run our testsand do all these.
And right now it's stillworking with our time frame in
(26:20):
the night.
But at some point, if we, if weuh releasing new apps and new
apps and new apps, it will notfit into the night anymore.
So what my idea currently is is,of course, I want to run my
tests, but the whole process ofcompilation and and creating a
container.
I don't need to use this foreach and every app.
(26:40):
So what I dream about is I haveone pipeline which is just
creating the artifacts bydownloading symbols, packaging,
push this to our own NuGet feed.
And there's another pipelinewhich is just downloading one
artifact after one app afteranother, publishes, executes
(27:02):
tests after another, publishes,executes tests, remove it or let
it there whatever you want anddo this again, and again, and
again.
So you'd only need onecontainer and because of the
isolation in tests, you don'thave any side effects if you run
multiple tests in in withseparate uh well, with different
apps.
So this is what I think we cansave a lot of time and also can
(27:28):
have the possibility to see sideeffects between the apps If we
disable the isolation, forexample, what you can do in
tests, then you can see okay,it's my app one somehow
influencing my app.
Two, because you do this all inone environment and you do this
(27:51):
much, much faster thanpreviously, because you don't
need to create a container.
I don't know, eight times in mysituation or eight times.
Speaker 2 (28:04):
Three, basically
because you're doing the current
the next minor, the next major,so you're doing three builds in
essence for each.
So with this so even take it,so you're doing it internally
you have eight applicationextensions that you have for
Business Central and with thoseeight applications you publish
(28:27):
them to NuGet, you push them toNuGet and then you can keep
multiple versions of those inthere.
And is that the intent?
So that if you have version24.1.9000, 24.1.10000, do you
keep all of them in there, or isit just for each build of
business central?
Speaker 3 (28:48):
um, you know,
basically, basically, we have,
we have, we are.
We are very focused on justhaving one code base for all the
bc versions we are.
We are supporting we're notjust supporting cloud which this
for all the BC versions we aresupporting.
We're not just supporting cloud, this would be way too easy.
We're also supporting on-premand so typically we are
(29:09):
supporting from BC 18 to thelatest version.
So what we do to master this iswe are working a lot with
preprocessor symbols, socompiler directives and say if
bc.
Speaker 2 (29:22):
By the way, blah,
blah, blah.
Speaker 3 (29:24):
So, and this is
working pretty pretty well, but
it's it limits us, of course.
For example, if you want to usenamespaces in our, in our apps,
um, we need a lot of thishashtag.
If BC blah, blah, blah stuff,and this is not very readable,
but as as long as we, as westick to the on-prem customers
(29:48):
and say, okay, we want to justserve one code base, um, I think
we we need to do this and um,yeah, but, but nevertheless, we
store all our packages, at leastthe latest version of each
minor version we created.
(30:09):
We store them forever.
Why, to be honest, I don't knowwhy.
I decided this sometime andnever thought about it again.
But, yeah, you see all thepackages in NuGet and you can
reference to it.
And if you, for example, havingmultiple code bases for the
(30:29):
different BC versions, of courseyou can do this with what
Freddy called or what NuGetcalled it, indirect packages.
So you have basically onepackage which is empty but which
references to another packageor another package per version,
and this package has a differentnaming and so on.
But that's not relevant, butit's more like a sitemap from a
(30:55):
website.
So you come there and you say,okay, I'm looking for 21 point
whatever.
And it say, okay, go this.
Say okay, I'm looking for 21point whatever.
And it say, okay, go this way.
I'm looking for 25 point one.
Okay, go this way.
Speaker 2 (31:06):
That's basically all
all the magic behind an indirect
package so an indirect packageallows you to have multiple
versions and that would beuseful for those application
extensions that if somebody'sworking with an on-premises
install where they have aspecific version, oftentimes you
would call the ISV and say Ineed runtime version 18, you
(31:29):
know a runtime version for 18.4.
Can you send it to me?
Yeah right, so doing it thisway, where it'd be helpful to an
application publisher when Isay application publisher,
anybody that has an app thatwould be helpful to an
application publisher, when Isay application publisher,
anybody that has an app thatwould be used as a dependency
potentially you can get it fromNuGet.
In that case, would it be theentire runtime version or just
(31:52):
the symbols?
Speaker 3 (31:56):
That's up to the
publisher basically.
So what we are doing and someother ISVs I know about, they
are shipping runtime packages,complete runtime packages with
the pre-compiled source code forthe specific localization and
PC version in NuGet feeds.
But I also know one publisherwhich just chips symbols over
(32:24):
the NuGet feeds, but that's alsofine.
Speaker 2 (32:27):
Okay, it's up to the
ISV how they like to distribute
it.
But where it becomes helpfulfrom an app publisher is they
can publish the information forthe specific versions, including
the latest version, to make iteasier for everybody to have a
dependency.
Based upon that, I want to getinto your app because this
sounds like a lot.
I understand the process now ofwhat it does.
I have a good sense of how itcould be applicable to me, I
(32:51):
think in my daily developmentOne thing that I was thinking of
when you asked this question,when you were talking about this
process.
So how does it know thevalidity of the package?
It may or may not be such acase with you know some business
central development or not,depending upon what the
(33:11):
application does.
But how do I, how can it beprevented that I don't publish
an application saying that I'mthe Microsoft system application
or Chris's applicationdevelopment company?
How do I know that the validityof what's in that NuGet package
(33:31):
is from the publisher that saysit is and it's a trusted
publisher?
Speaker 3 (33:38):
Yeah, that's a
problem.
Basically there are publicNuGet feeds like NuGetorg and
you as a publisher can go toNuGetorg and say, okay, I
reserve the prefix Microsoft dotfor my apps and only I can
(33:58):
publish apps with this prefixand, um, that's kind of kind of
a security mechanism.
But when I reference to what,what, what freddy said in in in
bc tech days and I also see Ithink Camille said on Directions
(34:20):
EMEA this year, don't trustNuGetorg because you don't know
what's inside there.
It could be anything.
But all the Microsoft itselfhas three NuGet feeds right now.
One is for Microsoft symbols,one is for Microsoft apps and
one is for AppSource symbols.
(34:42):
So each and every AppSource appis already published by
Microsoft in the latest version.
So there's a NuGet feedavailable where you can search
for each and every AppSource appand put a reference on it and
use it.
Speaker 2 (34:58):
So Microsoft?
So they have a serverthemselves for their symbols.
It's basically DevOps.
Speaker 3 (35:03):
It's a DevOps
instance, Azure DevOps instance,
and they are serving us apublic NuGet feed from well.
Three public NuGet feeds,basically, from there.
Speaker 2 (35:14):
Including all the
apps in AppSource.
For the latest version of theapp that's in AppSource.
Speaker 3 (35:18):
Absolutely, and at
this point, when you submit a
new app in Marketplace, it willbe automatically populated to
the NuGet feeds as well, so youdon't have to care.
As an AppSource publisher, youdon't have to care about all
this stuff.
Speaker 2 (35:35):
That's pretty cool.
Speaker 3 (35:37):
It is definitely Now
I'm anxious to know how I use
all of this and, additionally, alot of ISVs.
To be honest, currently it's alittle wide west, so there are
naming conventions.
It's pretty much the same, likethe early days in AL.
Like the early days in AL, westarted with codnumbernameal and
(36:04):
then we changed this all andnow it's the object
namecodeunital, and I see a lotof people which are using some
completely different namingconventions and deactivate the
code cops for complaining aboutthis stuff.
And in NuGet it's pretty muchthe same.
(36:25):
We have AL now in place I thinkfrom 2018, I think and the
possibility was always there todo things like NuGet, but no one
did.
And, as I said last year at TechDays, I heard more or less the
(36:47):
first time from this topic.
So it's five years later.
And, of course, isvs like weare had the problem to you
referenced that you go to apublisher and say, hey, I need a
runtime package for version 18,20, whatever, and then the most
(37:08):
of them say, okay, I need a dayand then I will serve it to you
, and some other ISVs came upwith the idea and said, no, I
don't want to do this.
I ship my packages as runtimepackages, precompiled, and you
can download this just from mywebsite or from a universal
(37:29):
package feed or from whateveryou want to use, and we, for
example, we have just a downloadpage.
Go there, there's your apps,select your version, click
download.
Happy, but this is the old one.
Uh, when we started to adapt toto new get, we will.
We will deprecate the site andcompletely switch to new get
(37:49):
because it's much easier tomaintain for us.
But, um, we all the publishers,had the problem.
Okay, how do we serve customers, other partners, with our
packages in certain versionswhich are not in Epsos?
And they all invented cleversolutions, but it is how it is.
(38:15):
When you ask 10 people, you got13 answers how you can do
things.
Speaker 2 (38:26):
And that's how it is
currently.
Speaker 3 (38:27):
So naming conventions
from the packages is pretty
important for software.
We have a manifest and, in bestcase scenario, we have an app
ID.
We have the publisher name andwe have the app name.
As I said, publisher name andapp name are fluent.
They can change over the time.
(38:47):
So the only thing which you canrely on is the app ID and you
specify a minimum version yousupport, which is also quite
complicated because, let's behonest, how often do you update
the version number in yourdependencies?
Speaker 2 (39:09):
Yeah, right Depends
it depends.
I personally would go andupdate it because if I have a
dependency on an app that adds anew method or adds something
new, I'll go in and change it onthe app that uses that
dependency.
And I will say, yesterday I wasrunning some tests and I looked
at the app file because I hadto update the app file version
(39:32):
of the tests and they were allversion 20.
And this was for version 25.
So I updated the version 25.
Speaker 3 (39:38):
Yeah, it's the same
with me.
I'm lazy, as I said, and, um,yeah, then you have to.
You have to think okay, how canthe software determine which
version is?
Is what you're looking actuallylooking for?
When you just have onecontainer where you specified
which version the container isrunning off?
It's pretty easy because youjust say, hey, I have this app,
(39:59):
please give me a version, andyou just get the version which
is basically there.
Um, but when you have anartifacts feed where you have
all the versions from thebeginning to wherever you are
today, you have to select theright one, and this is a little
complicated, and so we needthings like naming conventions,
(40:24):
we need things like rules wherethe partner is working with.
So some partners I know aboutare just using the BC numbers so
25.1, 25.2, and then theirversion is following.
Some are completely in theirown number range, so it's tough
(40:47):
for a piece of software.
Speaker 2 (40:49):
So, if I'm an
application developer, I want to
go from this in both ways,because I understand the concept
of how it works.
One thing we talked about froman ISV point of view you had
mentioned.
Or from ISV point of view youhad mentioned, or from a
consumer point of view.
I do want to talk about how toconsume this right.
I understand the process now asfar as conceptually how it
works.
You had mentioned not to trustNuGetorg all the time, or to be
(41:14):
leery of the extensions and thenverify that it's authentic, or
someone could host their own.
If I'd like to host my own, yousaid I could set it up in
DevOps.
Right, is what you use for anexample.
What if I don't want to host myown?
Does my only option NuGetorg?
(41:34):
Does Microsoft have something?
Are there other places that youcould put this where it could
be authenticated that it's youthat is actually sharing this
file there?
Speaker 3 (41:46):
are different
providers.
The most common is basicallyNuGetorg.
And if you use the verificationstuff and if you keep your
stuff together, the secretstogether and all this stuff,
it's pretty secure that we areworking with the right publisher
.
Speaker 2 (42:07):
But what you have to
keep in mind is the only
reference we have is the app ID.
Speaker 3 (42:13):
So when you download
using NuGet, basically we are
looking for the app ID usingNuGet, basically we are looking
for the app ID.
And if someone is not thatfriendly and uses the same app
ID because that's basicallypossible you can just specify
any GUID you want and push thisto NuGetorg.
It doesn't need to prefix withMicrosoft, so it's not secured.
(42:38):
But maybe the software thinkshey, there's the app ID, so this
is the right one and I'mlooking and I'm downloading this
one and this is how.
So we have to go from one thingwhich is just the app ID to a
whole complex NuGet naming thingwhich, in Freddy's preference
(43:05):
it contains the publisher name,dot.
The app name, dot.
Maybe symbols, dot, maybecountry code, dot.
App ID at the last.
And if you have thesecomponents in the name we can
make the software.
For example, my extension, oralso NuGet.
The NuGet executable itself canmake pretty sure that you are
(43:28):
running against the rightpublisher.
But when you're just seekingwith the app ID, that's not that
much of a problem.
All the big ISVs have now kindof NuGet feeds in place or
universal packages feeds inplace, so all the big ones have
(43:48):
it and as far as I know, the bigones which do not have a NuGet
feed, they're working on it.
And if we serve more and moretools Freddie did a great job in
VC Container Helper.
Patrick did also a great jobwith his DevOps extension to,
(44:12):
with his DevOps task I think itwas a task to download packages
and also his NuGet helperextension in VS code.
So there's another one in placealready and so as more tools we
have, as more partners as moreISVs will use it, and I think
(44:34):
it's the first days I also saidokay, of course, we reserved our
prefix at NuGetorg, but wenever published a single package
there because we don't need it.
We have DevOps and all theothers too.
Speaker 2 (44:49):
Okay, so now we have
multiple feeds that are
available and the authenticityof a NuGet package.
It's not just an AL thing,that's just the way NuGet works
in general.
So I just wanted to point thatout.
It's something to be aware ofand just make sure that you know
the source of where you'regetting the file and what you're
getting with it, so an ISV canpublish their extensions I
(45:12):
understand the concept of thatto their NuGet feed.
Right Now I want to write anextension that is dependent upon
the Microsoft application theMicrosoft system application,
the base app, the system app andthe foundation app.
So I have those threedependencies right from the
beginning.
Then also, now you have anextension that I, you know,
(45:34):
think is a wonderful extension,but maybe I want to make one
slight change to the process.
So I have to use yours as adependency.
I'll subscribe to event and dosomething.
How do I get it and how do Iknow where it is?
And then, how do I get itwithin my application?
Because now, as you talked about, I could create a container.
I get the symbols from you or I.
(45:55):
You know, I download it into my.
If it's an online environment,I can install it in the online
environment.
If it's a container, I get thepackage and install it, download
my symbols and that symbol isthere.
In this new case, I'm no longergoing to a BC environment
whether it be a container-basedenvironment or an online
environment to get the symbols.
(46:16):
I'm going to a NuGet feed.
How does that work?
That is where now I'm stuck.
How do I know to go to thispost office box to get the file
for this particular version?
How do I do that as an ALdeveloper?
Speaker 3 (46:30):
Basically, as an AL
developer.
There's no difference.
The only thing which changes isthe command you executed.
So you're not hitting ALdownload symbols.
Instead, you may hit restoreNuget packages.
And what happens?
The NuGet package will bedownloaded.
(46:51):
So the package will beidentified, it will be
downloaded, it will be extractedand the app file from in the
package will be placed in the ALpackages folder.
Speaker 2 (47:01):
So the only thing I
have to do is rebuild NuGet
packages.
Restore yeah, basically, oh,restore, but is that with?
Okay, I want to talk about yourextension soon, but is that
within the AL language torestore NuGet packages?
Speaker 3 (47:14):
That's within your
extension.
Yes, what I did, and that'salso what Patrick did, was this
NuGet helper extension.
Speaker 2 (47:18):
Okay, so now.
So within your extension,what's the name of the extension
that's in the VS Codemarketplace, if anybody wants?
Speaker 3 (47:26):
to search for it.
Speaker 2 (47:26):
ALget AL not.
Speaker 1 (47:30):
NuGet.
Speaker 2 (47:31):
ALGET, alget, alget.
Okay, so with ALGET, I installthe extension.
The ALGET will look at thedependency in my app file and
then, based on that dependency,how does it know where to go?
Speaker 3 (47:48):
And then, based on
that dependency.
How does it know where to go?
So built in or baked into theextension.
Of course the Microsoft feedsare there, so you don't have to
specify the Microsoft feeds, theapp source feed, the app
symbols and the MS symbols andthe MS apps.
So it's all three in there andby default it looks up to this
(48:14):
feeds at first and tries todownload the apps from there.
And if it's not, if it doesn'tfind the symbols, the artifacts
or the nougat packages in there,we will look for custom feeds
which you can specify, for wehave some custom feeds for our
own apps, for our internal stuffand also for partners we are
working with.
And then it looks there andsays, okay, maybe I find
(48:37):
something, and then it downloadsit basically oh, okay.
So that makes it much easier.
Speaker 2 (48:43):
So in your settings,
I'm sorry so in your settings
you can specify the additionalfeeds to work with.
So, as an AL developer, Iinstall your extension, which
already makes it so much easier,because I just have to do, you
know, rebuild.
Speaker 3 (48:56):
What do you say
Rebuild?
I always want to say rebuild,restore.
I knew it wasn't rebuild, so Ijust recycled it.
Speaker 2 (49:03):
No, no, it's good,
it's good, I'll have to get the
restore.
So if I click restore, it works.
I like that.
So then if I have a dependencywith an ISV or somebody else, I
would ask again.
So what I would need to do isask them where are your NuGet
packages, and if they have them,they would send me the URL
(49:24):
right that says here's where mypackages are, and then, within
your extension, there's asetting where you could list all
of those custom ones, and whenyou go to look for the packages,
you go through those customsettings.
Oh, that makes it so mucheasier.
See, now I don't even need tounderstand this.
Speaker 1 (49:40):
It's like Lego pieces
, right, Like it's just like
it's.
It's uh, you, you're buildingsomething and it's like yeah, I
need something very specific.
I'm going to look at this, thisbucket, or in this, in this
case, and you get, if it alreadyexists, perfect, I don't have
to build it.
Speaker 3 (49:56):
And what's a?
What's a?
Pretty sounds like that.
Pretty nice thing is at somepoint we are not there at the
moment and maybe not next year,but at some point maybe we got
the idea of new get also intothe PC world, because everyone
who ever works with, with dotnetlike like C sharp or something
(50:20):
like this, and started withJason, everyone knows Newton
self, that Jason, no one writeshis own class to pass json files
and it's not from microsoft andeveryone used just this as an
library.
And maybe at some point we arenot just the community, the
(50:42):
dynamics community will not justpublish apps, commercial apps,
but also apps which are somekind of a library and solving a
problem which is not thatimportant that it can be placed
into a system application orsomething like this, but it
(51:03):
serves a specific need.
And maybe we can go to this aswell, at least in my fantasy,
and say, okay, I don't need tocreate and let's, let's stick
with the json, json example, Idon't need to create and pass a
parser for json and and I canjust use the package from from
(51:24):
publisher x, x, y, because Iknow this one, because the
community talked about it orwhatever, and I just use this as
a reference in my package and Idon't have to re-enroll, I like
it.
Speaker 2 (51:39):
I think of, like the
type helper code unit.
I think of some of those, whatI call those utility libraries.
A lot of individuals makeutility libraries that are
available on GitHub that I coulddownload and use and
incorporate.
But in what you're saying Ilike that idea.
Now we could have even acommunity-driven library right
that you could call a quoteopen-source library for AL that
(52:02):
people can contribute to.
Again, if you want to referencethe JSON parser that you had
mentioned, that we can justcontinually build upon from the
community point of view to helpAL developers.
So I agree with you At thatpoint.
It's not a marketplace right oran app source gallery.
Speaker 1 (52:19):
It's like Amazon.
Speaker 3 (52:22):
I like what you said
with Lego.
It's pretty much like Lego.
You don't do all the componentsover and over again, you just
reuse what's already there andif there's an issue and the
maintainer or the maintainersfound this, they fix it and it
can be a community project.
It can be open sourced, andit's not necessarily it must be
(52:48):
necessarily controlled bymicrosoft, which is not a bad
thing at all.
So it's great, but noteverything belongs into a system
app no, I agree with you there.
Speaker 2 (52:59):
And then also
sometimes you can you get I
don't want to say it's bettersometimes microsoft has their
efforts focused on certain areasof the application.
It's their application justifythat don't fault them right,
they don't have.
Nobody has the resource you knowthe resources, whether it be
dollars or talent to doeverything for everybody.
(53:20):
Right, so they have a timelinefor what they're working on with
the application.
But if there was a way to pullin some things where others
could create beneficial tools tosupplement that you, you know,
similar to what they're doingwith the contribution pilot,
which is great because it allowscommunity members to enhance
the functionality of theapplication in addition to what
they have on their plan.
(53:41):
This would create a list oftools as technology comes out,
because anytime there's a newtechnology, everyone's like well
, how do we communicate with webservices, for example?
How can I consume API endpointswithin Business Central?
You know, I know we have thelibraries in there now, but if
the libraries don't exist, ifsomebody could create them, use
them as a dependency, you knoweverybody could build it, and in
(54:03):
some cases it's better becauseyou have multiple eyes looking
at it, versus somebody creatingone thing that they're putting
in a black box.
I like that idea, see.
Speaker 3 (54:15):
I think this will
open up and I'm still waiting
for ALnet by the way, it willneed a lot of time because we
have one big problem in AL whichprevents from doing this right
now, and that's basically theobject ID.
Oh, forget, it prevents fromdoing this right now.
Speaker 2 (54:30):
And that's basically
the object ID.
So, oh, forget it, I'll be.
I was hopeful that that objectID would go away many years ago.
Speaker 1 (54:37):
I thought they'd been
talking about that for a while
now.
Speaker 2 (54:39):
You know from what I
see and hear and what I read,
right, everything you read onthe internet is true is.
You know there's beendiscussions about the object IDs
and I guess a lot of the corefoundation architecture and the
service tier still uses the id,so they'd have to do an overhaul
of that.
Part of me just wants to sayjust do it.
You know we're getting to thepoint where you know we have.
(55:01):
You know, naming collisions issomething we have to look at.
We have to look at object idcollisions.
They're still both unique.
There's like we have nowmultiple unique identifiers for
an object, which is limiting.
So I would love to get rid ofthe object id.
Now I know the challenge iswith the object id because you
have licensing for on-premises,because you still license the
objects that you're going toutilize on the online.
(55:25):
You don't have that limitationbecause you still can work
between the 50 000000 and 99,000range.
But I would love the object IDsto go away on the field level as
well as the table level or,excuse me, the object level.
You know the field level andtables and then also the objects
ID for the objects in there,and maybe I won't be around when
they finally get rid of it.
(55:45):
In that time, that's what Iwould like you know, we should
have.
You know, chris, next year wehave to put a note, we need to
have.
What are your 12 wishes forChristmas?
And I think one of my wishesfor Christmas, my number one,
would be get rid of the objectIDs, because they're just a pain
.
Speaker 3 (56:01):
I would say save this
wish for the next two years.
I think that's.
Speaker 2 (56:08):
You think two years
maybe two years we see it
developing very very fast.
Speaker 3 (56:12):
But I think I think
in the base code of all the
service stuff and platformthere's a lot of stuff with with
object IDs and so on, so theyhave to rethink a lot of things
like like record references theyall work with with object ids
(56:32):
and yes, so I think this is notan easy task to to serve, but of
course this is much.
This is preventing uh from fromshipping libraries, because when
you develop a library you haveto.
Okay, what object idea did Itake for this?
(56:53):
And how do I make sure that inmy customer tenants it's not
already taken by PTE or bywhatever?
Speaker 2 (57:01):
Whew, it's tough.
Yes, I see Good luck.
You'd have to have the appsource range, which is the only
thing that you could have tolimit it, but you still think
two years, that's interesting.
Two years.
We'll talk and see if it'sgoing.
Speaker 3 (57:15):
I think just look
back as I said, I think 2018 BC
came really up and all thenaming and see what happens in
this time.
We got a lot of things.
We got a lot of cool things.
We got interfaces, namespaceswe still have prefix and suffix,
(57:36):
but at least we have namespacesnow.
Speaker 2 (57:39):
I think maybe the
namespaces will help speed that
along, because now we're gettingmore and more conventional with
the development within al.
It's almost c-sharp, like, in asense, right with a, with a
hint of pascal, still um, sothat that would be my wish list.
(58:03):
That's what I want santa tobring, but I won't get that this
year and I'm hoping that I'llsee it in my lifetime.
Speaker 3 (58:12):
Well, in my career,
as I said, it's in my wildest
dreams.
Maybe at some point we will bethere and we will use packages
not just as commercial apps orfree apps in App Store's range
or free apps in AppSource range,but also as components for our
(58:33):
solutions, for our PTEs, for ourISV solutions and not every ISV
needs to create a text editorand not every ISV needs to
create, I don't know the common,common stuff which comes over
and over again no, there are.
Speaker 2 (58:52):
There's some.
There's some things that I userepetitively in apps.
You know a lot of the whole,whether you have the.
Yeah, I create some of the samefunctions for communicating
with web services over and overand over and over again and it's
in essence, they're all thesame.
You just pass in differentproperties with different values
, so there isn't a need to.
(59:13):
You know, have everybody createsome of that.
I call that basic stuff, likeit's the art of what you're
writing isn't the consuming ofthe web service, right, or the
connecting and downloading.
It's the processing of the data, it's the what you do within
(59:34):
the user interface for thecustomer to makes it better.
But the task of connecting to asite and downloading the file
shouldn't be something that youhave to write over and over and
over again.
Speaker 3 (59:38):
Just use a library,
because we all create our own
libraries to do differentfunctions and as I said, there
are some libraries which are,which are worthy to, to get
integrated into the system app,for example, or whatever, or
business foundation or whateverit's right at.
But there are also some appswhich are not worthy to get
(59:59):
shipped to each and everycustomer of Business Central but
will maybe be worthy to ship asa component which can be used
for, let's say, 10% of thecustomers, and it's not worthy
to do this in the stock, inplain vanilla, but maybe at some
(01:00:23):
other point.
Speaker 2 (01:00:25):
No, I do like that
and I like the approach that
they're taking.
Forget of having themautomatically installed or not,
with some of the the corefeatures they have as separate
fun features, and you have toturn the features on or off, or
you have to turn, you know,enable the apps, install the
apps or not.
I like the ability to haveseparates because, like you said
, not everybody needs contractmanagement in their business
(01:00:48):
central environment.
Um and uh, you know, sometimesintroducing some of these apps
may create issues forenvironments.
So I like the option to be ableto choose the features that I
want, even with the shopifyintegration.
Shopify integration is a greatapplication, but it's not
relevant for everybody.
So why have it running?
(01:01:10):
Uh, why haven't go through it?
Because even some of these, ifyou look at some performance
analysis, some of these greatextensions, such as contract
management, show up in anyfunction that you're doing, such
as posting a sales order, whichyou know doesn't even use
contracts.
So you're right, absolutely.
Sometimes I'm right, not always, just sometimes.
(01:01:32):
It's my new tradition to becorrect on Friday.
Okay, so that simplifies things.
So, from an ISV point of view,they can publish their stuff on
a NuGet feed, somewhere thatwe'll have to have a longer
conversation sometime on how Icould do that.
But for the consuming of that,your ALGit extension for Visual
(01:01:55):
Studio Code can simplify theconsumption for a user such as
myself because it reads thedependencies in the app file.
It will go look for the feed.
You have the standard feeds inthere for your applications as
well as Microsoft's, and thenthe ability for a developer to
put in a path for the otherextensions.
And if you can't find anextension, then it just goes to
(01:02:18):
Business Central, the BusinessCentral environment as it was.
Speaker 1 (01:02:22):
Yeah.
Speaker 2 (01:02:23):
Yeah, excellent,
excellent.
I like this.
I want to play with this more.
I'm going to do some experimentwith this and now I understand
this NuGet lifecycle Well, sir,thank you for taking the time to
explain this to me and make itmuch easier for me to understand
how NuGet is going to helpmyself and other AL developers
(01:02:47):
with their continued creation ofBusiness Central extensions,
and I appreciate you creatingthat tool to make it easier,
because when we were talkingabout it, I understood the
process and the theory, but itsounded like it was going to be
complicated to be able to putall this together to download
these NuGet packages, and Iappreciate you creating such a
wonderful tool for everyone touse.
Speaker 1 (01:03:09):
I commend you for
taking the time to do that.
Yes, we're all limited in timeand you putting that effort in
it helps the world.
Speaker 2 (01:03:16):
Well, let's go back
to what we started talking about
.
You know, time's the mostprecious resource.
Once you use it, you don't getit back, and you're spending
your time to do that, to savetime for everybody else, to give
us the opportunity to do better.
You know, do different thingswith our time, so I appreciate
that and you know anybody elsethat has some of those
extensions.
If anybody would like to learnmore about the applications that
(01:03:37):
you have, about NuGet or ALGet,what's the best way to contact
you?
Speaker 3 (01:03:44):
I think the easiest
way is directly through our
website.
As I said, I'm the founder ofthe company, so I will always be
available for anything, even ifit's the community-driven
things like ALGAD, but also ourcommercial stuff.
So it's our website365businessdevcom.
Dev like development and, yeah,I'm also happy if anyone will
(01:04:12):
jump into ALGET and contribute.
So it's, of course, opensourced and it's published on
github and if you see someissues, just report them.
I will be very happy.
I currently work for the firstwork for for for the first not
preview release, for the firstuh real one which, which a lot
(01:04:35):
of things um in in backgroundhave changed, and also with um,
yeah, some preparations for fordevops, um tasks.
So I will also ship an an umopen source devops tasks, devops
extension to um, which whichfits perfectly into the bc world
(01:04:57):
.
You can basically use the, thenuget uh task in devops as well,
but they have some some umgarbage which will be left over
on the build server and I don'tlike this.
That's why I did a own one, anown task, but it will be also
free of charge and just will beavailable for everyone who likes
(01:05:19):
and I would be very happy forany contribution if it's an
issue which is reported orwhatever.
Speaker 2 (01:05:27):
No, that's great that
you're making that available
for the community and making iteasier for everybody, and also
it's nice that it's open source,similar to what we just talked
about to have libraries that thecommunity can use and others
can contribute to.
So again, thank you again forall that you do.
Thank you for creating such anextension to help AL developers
(01:05:48):
in the business center world, aswell as giving us a crash
course on NuGet and how it canbenefit us.
It's our pleasure.
We appreciate your time and Ihope that you have a great
holiday season.
We'll have to have you back onagain to follow up on this NuGet
when you add all those greattools and maybe we can go
(01:06:09):
through a process or an exercisescreen share.
Speaker 1 (01:06:11):
Yes, I really would
like to see now how this works.
Speaker 2 (01:06:14):
I visualize it, but
now, next time we'll go through
the process.
Maybe we can teach you know anold dog new tricks, as they say.
But with that, I hope you havea great holiday season, sir.
Enjoy the time with your family.
It's well deserved and it'salso important, and I look
forward to talking to you soon.
Ciao, ciao, bye Later, chris.
Thank you, chris, for your timefor another episode of In the
(01:06:37):
Dynamics Corner Chair, and thankyou to our guests for
participating.
Speaker 1 (01:06:41):
Thank you, brad, for
your time.
It is a wonderful episode ofDynamics Corner Chair.
I would also like to thank ourguests for joining us.
Thank you for all of ourlisteners tuning in as well.
You can find Brad atdeveloperlifecom, that is
D-V-L-P-R-L-I-F-E dot com, andyou can interact with them via
(01:07:04):
Twitter D-V-L-P-R-L-I-F-E.
You can also find me atmatalinoio, m-a-t-a-l-i-n-o dot
I-O, and my Twitter handle ismatalino16.
And you can see those linksdown below in the show notes.
Again, thank you everyone.
(01:07:25):
Thank you and take care.