Wolfram Resource System: Repositories & Archives: Live with the R&D team

Bob Stanheinrich walks through Wolfram's resource system: how to find and use resources via ResourceSearch and ResourceFunction, and how developers publish packlets through the newly opened Packlet repository. The system has no pre-publication human review, so reputation and versioning matter for trust.
Chapters
Hello, I'm Bob Stanheinrich, I'm a development manager here at Wolfram. And today I am going to be talking about the Wolfram resource system and focusing on the Packlet repository. So to start off, let's look at a quick agenda for this talk. So I'm going to introduce the topic, so what is the resource system? And go over some of the basic terminology that I'm going to be using throughout the talk and talk about why we have a resource system. And then I'm going to show how to use the resource system as a consumer, so like as an end user that wants to use the content. And then I'm going to talk about how to use the resource system as a developer. So if you have content that you want to create or publish through the resource system, how you can do that? And then I'm going to spend probably the second half, approximately half of the talk, focusing on the Packlet repository, which is the newest part of the, of the resource system. And then if we have time, I'll touch on some advanced topics and briefly discuss future repositories that are, that we're going to create. And then of course, we'll save time for questions at the end as well. So a bit of terminology, because I'm going to be saying these words a lot, so if you don't know what they mean, you'll kind of be lost. So I want to get that out of the way. So a resource object is a symbolic representation of some content that is made for the Wolfram language. So here's an example of a resource object. It has a name, space shuttle 3D model. And so that is like 3D geometry that is defined as a Wolfram language expression and it lives in, in the data repository. So it's a data resource. And this is not the actual 3D model. It's just symbolic object that points to the content and why. So if you have, if you already have the 3D geometry and you're ready to do computation, what's the point of having a resource object that just represents that content? Is a good question to be, to start off with. And there are two main benefits to having a resource object that represents some piece of content. One is you can attach metadata to it. So you can see like there's a description here. If I, if I open this up, you can see that there's some other metadata attached to it. And two, it provides a method for distribution. So the resource system is, is, is a tool for distributing Wolfram language content and it does that by, you know, sort of wrapping each piece of content in a resource object. All right, so what is a repository within the context of the resource system? So a repository is a collection of resource objects that all have the same type of content. So you know, the data repository is a repository where all of the resources are data. And that's a very sort of general term when you're talking about the Wolfram language, because any expression can be considered data, but we keep it pretty consistent. And all resources in a repository have a consistent metadata schema. So the fields in the metadata for a neural network might be different than for a function, but within one repository, like the function repository, all of the metadata is consistent. Each repository has a website where you can explore the content and learn how to use it. And each repository has a custom integration into the Wolfram language. So the way that you use content from a given repository depends. You know, it differs from repository to repository, but it's consistent within it. And then what is the resource system? So the resource system is the full collection of technology that is associated with resource objects. So it's all the tools for using resource objects, for creating resource objects, for distributing resource objects, which includes the repositories that are hosted in the Wolfram Cloud and the websites for those repositories. The whole ecosystem is what we call the resource system. All right, so that's what we're talking about today. So what are the repositories that we have? So these are the four big ones that are kind of publicly announced and user accessible. So, and you know, so this is the resource system itself is about 5 years old. And the first repository we made was the data repository. And since then we've had the neural net function and packlet repositories that we've, you know, released and announced and made available in. The packlet repository is the newest. And it just came out about a couple months ago is when we just opened it up to, to content from any developer. All right, so you want to use the resource system and, but, you know, you don't know what's there. How do you find content that will help you with whatever it is you're trying to do? So the, you know, the most straightforward way is to just search on this site, resources.wolframcloud.com can search for something like games and you know, you can find, and you can see here's results from the function repository. This is what this little orange icon means, or the data repository with this little, you know, library looking guy. If I go to one of these you can see here's the actual resource, I can use it, I can also search just in the data repository for something like, you know, soccer, you know, world cups going on and I'm American, so soccer is, is the term on, on my mind. Right. So, so you can search within a website. You can also sort of navigate using categories. So if I want, you know, to learn about meteorology, I can filters meteorology resources that are also associated with earth science and I can, you know, find data that's appropriate. And this same sort of website with this, you know, navigation is available for, for each repository. Right. Let me go back to my notebook. You can also find content programmatically in the Wolfram language using resource search. So if I'm, you know, thinking about playing some wordle, I can, I can search for that and it finds one function from the function repository and one data resource from the data repository that might, might help me. And I can, you know, just grab one of these things. I can paste it here. Oh, sorry, copy data, not copy position. So here I have the resource object. I can turn it into a resource function, you know, and I can just immediately start using it. Let's see. Well, this might, this might take a minute. We'll give it a chance. All right, so there, yeah, so there's a Wolfram language implementation of wordle that you can go ahead and waste your time on if, but wait until after the presentation. All right, so each repository, as I mentioned earlier, has its own custom integration into the Wolfram language. So each, each, you know, there's different functions for accessing the content for a data repository. Resource. The function is resource data. Right? So here's that space shuttle model before. If I want the actual 3D geometry, here it is, I just use resource data for neural net from the neural net repository. The main function you want to use is net model. So that will, you know, download and import a net chain or a net graph or maybe just a specific layer or something from the neural net repository right into your session. But also things like audio identify, even though you might not notice it or realize it, are also pulling in content from the neural net repository. So we have a lot of super functions, as we call them, that internally are downloading nets from the neural net repository for a function from the function repository. The tool for accessing the content is resource function. It'll return one of these little pill shaped blobs that works just like a function. So I can apply that function. Get this nice cool bird saying whatever I want for the new Packlet repository. One of the ways to access the content is packlet install. You can also use packlet symbol and we'll talk about the difference between those and how to use those later. But it's important to realize that internally all of these are using resource objects. So, you know, here is the. For each of the fun. For each of the, you know, inputs above for different resource types, this is. These are the resource objects that internally they were using. So all of these are backed by the resource system. Whether or not you ever see the resource object, it is the distribution mechanism that empowers these different functions. All right, so a few details about using the resource system that are useful to know before we talk about the development side of things. So when you look up a resource object using the name, where does it look for resource objects? So that's what resource system path is $resourcesystem path. So you can store a resource object in a lot of different locations. Like any persistence location, this URL represents the public resource system and all the public repositories. So when I look for a name, it's going to look in each of these locations and try to find it there. And so, you know, first it kind of looks in the in memory and then it looks on my local file system and then it looks in a public repository and then it looks in my cloud account by default. And you can rearrange these as you want or add additional things. We might have time to talk about that towards the end of the talk about like multiple resource systems. So, and another important point to think about, when you retrieve a resource object, typically it only retrieves the metadata. It doesn't retrieve the content immediately. So here I have this data resource and I give it the name and I get this resource object where the content is a graph expression. But it didn't download the graph right. It only downloaded this metadata that contains a pointer to the graph. It's going to wait to download it until the first time I use it. So if I do that with resource data, you see, that's like 900 milliseconds and it'll store it locally on my file system as a cache. So then subsequent times when I evaluate that, whether it's in this session or if I come back in a week and do it again, it'll be, it'll get these faster times so I won't have to download it each time the local caching in place. So the sort of the metadata and the content can are retrieved independently to make things as efficient as possible. All right, so that's sort of the end user portion of the talk. So hopefully kind of makes sense how you can find resources and use them. And they all should just sort of flow seamlessly into standard Wolfram language development. Whether it's data that works just like any other data or functions that work just like any other function or neural nets, you know, you can access them and just use them right away. But now I'm going to talk about development. So if you have data or function or a packlet that you think is going to be generally interesting and useful to other people, how do you, how do you turn it into resource object and either, you know, share it with your colleagues or submit it for publication. And the way that we usually do that is with a definition notebook. So I'm going to open up a definition notebook for function resource. Let me exit full screen here. So here's the definition notebook for function resource. And so basically, you know, the function that I want to share to the world as a resource object will go in here and then all these other fields are fulfilling in the metadata. So if I had something like, you know, World cup results of. Oh, typo, let's fix that. World cup results of team and let's say it's you know, importing from some, you know, FIFA.com something you know, and then, you know, post process. Yeah, imagine I had some, some, some nice code that sort of brought in the latest results. So I put the code here. Then I would take the name of the function, say that's the name of my resource object and I would give it a little description that's like retrieve the latest results. I would write documentation in like the structured format that will appear on the website everywhere. So imports results for the team, for team from FIFA.com or something. Right. So and then you want to use these built in tools like template input is usually your best friend. All right, so I'm not going to keep filling this out, but the idea is you would fill in this notebook because I'm going to do a full example of this with packlets in a few minutes. But what I do want to highlight is these buttons up here. So this check button is what really shows the. One of the main, you know, use cases for these definition notebooks is it'll go through and it'll try to validate all the fields for both content and metadata in the notebook and find places where there's a mistake. Right. So descriptions usually end in a period. That's right. So see that there was an auto fix function that put the period in there for you. And we've, let's see, what else does it say? No author information given down here. It wants me to put an author if I'm going to submit it to the public function repository. This is a requirement I have to put in my name. So this, you know, check button with its built in hints and suggestions is a super useful tool for, you know, getting your content and metadata in sort of to a standard form which is, you know, ready to be published. We also, you know, talk about this in a minute, but there's a link to style guidelines which is really useful if you're planning to submit. All right, so let's go back to my presentation notebook. So as I was showing, the definition notebook allows you to specify metadata that should be attached to the content. It has that check button that validates the content and metadata. And then once the notebook is filled in, it has built in buttons for distributing the resource. Here, I'll go back briefly and show that. So there's this deploy button. It has lots of different places where you can package up the resource object and deploy it either locally or on the cloud. And then finally a submit button where you can add it, send it to the function repository for the review team to look at. And as I showed with that style guidelines button, each repository has a set of standards and guidelines that you should read and consider if you're planning to submit to the public repository. And then most repositories have a review team that looks at all the submissions when it comes in and sends comments and edits to tell the creator what needs to be changed in order for it to be published. And if it's, I mean, if it's great, they can just publish it right away. But there's sort of that, you know, human communication that ensures that the content in our reviewed repositories is good and something that you'll want to use. And I say most because the pack repository is different and we'll talk about that later. Publishing in a repository also requires a publisher id, which are free. You can get one so that that sort of identifies the entity that owns and is responsible for the content. And a publisher ID can represent a person. It can, it can be your name. Like here my publisher, my default publisher ID is Bob. Or it can be an institution, it can be a university or a corporation, or just, you know, a group of colleagues that kind of want to collaborate together on content. So yeah, but you need, and one person can have multiple publisher IDs and a publisher ID can have multiple authorized users, and they're free. It's just a requirement to make the whole system work. And we'll see that more when we talk about packlets, which is now. So, so that's sort of, that the, the general conversation about the resource system that applies to all repositories, how you can find content and use content and create content and create definition notebooks and, you know, validate the content and distribute it. So that all kind of applies across the board. The neural net repository is only really, really open for internal content creation right now. If you have something ready in the Wolfram language, by all means use that contact form that's on the website, let us know. But it's kind of a more, more personal process because it's, it's not, not as common for external people to be doing that sort of development. All right, so packet repository. This was just opened for general use about two months ago, and since that time we've put out a lot of information about how to use packlets in the Packlet repository. You know, this talk is one, but there's also several other videos that are publicly available, as well as documentation. And all of those links are in the last slide of this presentation, which will be made available on Wolfram Community later today, I hope, or tomorrow maybe. So this notebook will be available and it has all the links, and we'll see that at the very end. But for now, let's go and look at the website for the packet repository. So this is the homepage. We have these featured packlets, which are packets we've chosen to kind of meet all of the guidelines and are useful that we've decided to put on the homepage. But you can also just browse all the content. We've got 55 things currently, 55 packlets. You can go to any one of these. Let's go to this guy here. So this one was one that our chemistry team made. And you can see over here on the sidebar, we have links to the individual documentation for specific functions. I can look at one of those. I can come back here. I can see how to install the packlet, what the context is to load the kernel extension, and you can see the history of when updates were made. So you can see the developer was very active in early October, right when the packlet repository was opened up. And I can take any of these guys and I can click on it to copy it, and I can go back to my notebook and paste it in here. This, this is a sort of intermediary step that you'll see when the input is large. But here we have this packet symbol. When I hover over it, you see that this pill shaped blob kind of like a fun resource function, but it's actually a packlet symbol and tells me the name of the packlet and the function within that packlet that it represents. And if I evaluate that it all just, all just works. So what packlet symbol does is it will guarantees that the packlet is available on your computer and it guarantees that the packlet context is loaded and then it becomes the function from within the packlet. So this will just become. Oops, sorry. Will just become the symbol from within the packlet. And so this, you know, it sort of automates a lot of things. If the packlet is already installed and loaded, it's pretty, it's a pretty trivial function. But if you're using a packlet for the very first time, it kind of automates that downloading and unpacking and loading process that can be very difficult to do manual or, you know, confusing, not difficult, but confusing to do manually and in a lot of languages is a huge headache for, you know, sort of accessing content for package managers. This really simplifies it. And it's also important to note that it only does this for within the current session. So it won't permanently install the packlet like packlet install does. It's like, you know, it's like dating versus marrying the packlet. If you don't like the packlet, you quit, just call quit, get a new kernel session and, and you're, you know, you're free from it. It won't affect it. Packlet install however, you know, persistently installs the package. So it's part of your Wolfram language environment. So anytime you want it, you just call needs and then the symbols in there are available. It's, you know, it's added to your context path and I can just use them. Right. So this Catalan unrank is within this Peter Burberry recreational mathematics context. But it's just available whenever I call needs. And here's an important thing to notice here is with all of these, you see Peter Burberry's name here. He's one of our most avid developers for the packlet repository is in the names. All the names that I would use as a user of his packlet all start with that. And that's his publisher id. I guess it's his real life name as well, but it's his publisher id. And so this means that if somebody else wants to publish a recreational mathematics, they can do so. And it's that we, we eliminated the like, land rush sort of scenario with a within the packlet repository. And you know, when you're using Peter's content, you know that it's his and if you trust him, you feel safe using it. And so there's definitely a trust component to using content from the packlet repository. That is important because this is like I was saying this, like this repository does not have that internal, that Wolfram review team, like the function repository. Anybody that has a publisher ID can publish content to the packlet repository without a Wolfram staff being in the loop. You push the button 5, 10 minutes later, it's public in the repository, inaccessible. Right? We have guidelines and if something's breaking those guidelines, we can take it down. But, you know, generally there's not a review team in. In the loop. So it's important to sort of have trust and reputation system that this publisher ID and the name guarantees. Right? So that's how you use packlets from the, from the new packlet repository. So how do you create packlets? So the same group here, the R and D team, had a presentation from my colleague Connor Gray in September that is in the set of links at the end of this presentation. But if you missed it, I highly recommend going back and watching it because he kind of really gets deep into packlet development. But so I'm just going to kind of gloss over this programmatic packlet development. So there's a packlet. There's a. There's a package called Packlet Tools that creates. That has a bunch of tools, one of which is Create Packlet. I give it the name of an empty directory and it creates the layout. I can look at the files in there. I'm making one called Computational Beer. So this is a new packlet with no content in it. It's just a layout. There's two WL files. So those are Wolfram language code files. One of them is this packlet info file, which tells the Wolfram language how the packlet should be integrated into the Wolfram language. I can look at this and see, you know, it has the name and version and a bunch of, you know, information about the packet. These extensions say how to integrate into language. And then it also had this computational beer wl. So this leave full screen. So this is like the code file and I could just dump all of my code that I want in here. That's sort of a easy way to get started to make a real packlet. Oftentimes you want to kind of replace this file with a loader file. And we can talk about that in the question and answer if people want to. But, you know, you can. You could just dump your code in here and get going. You see, the say hello is just sort of placeholder dummy function. All right, so that's sort of computationally creating a packlet to get started. But what I really want to highlight is how to do it instead of programmatically with a definition notebook. So just like the function repository has a definition notebook, so does the packlet repository. So I'm going to call this. And it doesn't immediately open a notebook. It's puts me into this dialog where it wants me to choose a directory. So let's, let's choose a directory. I'll go in here and I'll create a new folder and I'll call it, you know, World Cup Statistics, and I'll choose that. And now my dialog has all these fields, and you can see it has Publisher id and the name that it puts in by default is bot is the publisher ID slash, the name of the directory. It wants me to give it like a version and a description. I can say, like, you know, compute stats for World cup games. And I hit, okay, and now this is doing the same thing that Create packlet, that function I used, you know, two minutes ago was doing, but it's also doing a little bit more. Let me exit full screen. And so here I. So this note here, now we have the definition notebook that's, you know, very similar to the function repository notebook, except this notebook. Yeah, the function repository notebook contained the function. This doesn't contain the packlet, it just references the packlet directory and it contains like this file browser. And if we look at this, it looks just like the files that we saw a minute ago when I called Create packlet. There's a World CupStatistics WL. You know, we had ComputationalBeer WL earlier. There's PackletInfo WL. If we look at that by clicking on it, it looks a lot like the one before, except now there's a few more fields like description and, and license. And this. Bob, Publisher ID is in a few places. It's in the context, it's in the name. So this definition notebook is starting with the assumption that you intend to publish this in the packlet repository, and it's putting the publisher ID in a bunch of places and kind of has validation in place to do those checks. All right, I'm gonna close this for now, but we'll get back into that in, in mere seconds. Actually, I'm gonna close that documentation palette as well. All right, so that's how you would start fresh. So, but maybe you've already created a packlet and you know, you've had it for years and there wasn't a packlet repository and there wasn't a publisher ID requirement, but you'd like to publish it, but now you know you didn't build it with a publisher ID in mind. All right, so we've created a, a convenient tool for converting existing packlets for publication in the packlet repository. So I'm going to go here and I'm going to choose an existing packlet and I'm going to choose that computational beer packlet that I made with Create Packlet a minute ago. Remember, that was just Create Packlet, which was the computational tool. So it created it without a publisher id and it wasn't like created intended for the packlet repository. It was just sort of a normal trivial packlet. So now it's saying that the packlet is missing a publisher id. I apologize. This might be really small shared broadcast on the stream, but it's pretty legible for me and it gives me choices to modify the files in place or ignore the need for a publisher ID if I'm not going to publish it in the packet repository or create a copy and do the conversions there. And that's always the choice I like to make. It asks me what publisher ID it should use for the conversion, I'll use mine and then it's going to go and insert that name everywhere it thinks it needs to be inserted. Now there's certainly places where it could miss. If you're, you know, building symbol names using like two, you know, to expression or something, it's never going to find those. So you might have to go in and add the publisher ID in those sort of more rare cases. But if I look in, in here, you'll see it's put the, the name and the context in my code file. If I look at the packet info file, it's put my publisher ID here and here and inserted this publisher ID field. So it's sort of done this automatic conversion of, of the, you know, old or the standard packlet, the non packet repository packlet into one that's ready for the packlet repository. So now we want to, I'm going to take the next few minutes and kind of go through an example of turning this into a real packlet and, and using it. So let me actually Just go back here. I'm going to grab this little cheat that I had come back in here. All right, so I'm going to go to this code file. I'm going to add a real function that computes the alcohol by volume of a beer. I'm going to declare that symbol. I'm going to save this. All right, and now I like to come down here right to the examples and just like, you know, see if it's working before I do anything else. Beer ABV 1.06 1.01 all right, I'm going to add a caption for that. Compute the alcohol content of an ipa. All right, so this is working. So that's nice. So now I want to just go through and fill in the notebook. I'll start with this web content. So this is information that'll appear on the packlet repository website when you publish it or on the sort of homepage website if you cloud deploy isn't technically part of the packlet. It's just, you know, sort of display material to help users know what your packlet is about. And I need a placeholder image. You know, you can find an image online. You can create an image. Let's just create a lot, maybe lot. Make this X 1.03. Oops, sorry. 1.03. 1.1. All right, that's not a very exciting image, but we'll put it in there anyway. And then this brief description is usually like a paragraph or two short paragraphs that, you know, says what your packet is about. You know, collection of tools for brewing and you can give like some background. And drinking beer, like, you know, beer is as old as civilization now we can do it computationally. All right, so you know, a little description that'll appear on the website. These details is like a bolded list. So you could like list the domains that are covered by your packlet. You know, like I could say like fermentation. And, you know, I don't know, I'm not. I don't really brew beer, so I don't know what the domains would be, but. So let's see. So now I want to choose a main guide page that will be embedded into the homepage of my website. But I don't have a guide page. So this is going to refer to a documentation page. So I want to make a documentation page. And there's a nice tool for that. This documentation tools palette was new, I think, in version 13 or 13.1. And it's a really nice page for a tool for using the Documentation system that we as a company have been using for decades is now accessible to everyone. So first thing I'm going to do is create a function page for my beer abv. There we go. And I'm going to say how to use it. OG F G computes the approximate alcohol by volume of a beer based on the original and final gravities. All right, and then this template input button, once again is your best friend. I want to say format that. And then I want to add an example. Let's see, there's examples. I could say insert text. I could say compute the ABV of a logger. Your ABV 1.06, 1.02 I think should be, ah, it's a little strong for a logger. There we go. All right, so this is a pretty bad documentation page. I didn't write enough. But you know, time is a constraint, so I'll save that. And now I want to make a guide page because my goal here was to have a main guide page. So I'll say new guide page, I'll say what it is and I'll say call it brewing functions. You could imagine I would also have like, you know, drinking functions or something like that. All right, so tools for brewing better beer. And then I want to say beer abv. Give it. Estimate the alcohol content in a beer. And that's my only function now. So I'm gonna delete these, I'm gonna save this, I'm gonna close this. But now I have a guide page, so I can choose it here automatically puts me in the right directory. There's my guide page. I'll select it. All right, so I filled out this web content not very well, but it'll do the job for a demo. I've already put in some examples here. I'll delete this one for now. Now I have this metadata. I want to put my name here, this source control. We very much want to encourage you to take your, your source code and documentation, take this whole directory here, this whole packlet directory, you know, and put in GitHub or some other source control site, right, BitBucket or whatever you prefer, put it in a source control repository and make it public, if you don't mind. And then if you want to do collaborative development, typically that's going to happen there in GitHub, not necessarily through the packlet repository. And the workflow we want to encourage is you create a release branch in GitHub and that gets published to the packet repository. But yeah, I'm not going to take the time to do that right now, because our time is limited. But that's what we want to encourage people to do. I can choose a license. I need to choose a license if I'm going to publish it. MIT is one that's a good license for the packet repository. So I'm not going to modify that. I'm going to add some keywords like food and drink, alcohol, brewing, fermentation. All right? And then I'm gonna choose categories so that people can find this on those navigation pages that we saw earlier. So I'm, you know, it's cultural for sure and it's medicinal, so I'll choose those. I want to find some related resource objects. So, you know, I like to search on. On the resource system, what we were looking at before. Here, just search here. Let's search for beer and see what we find. I don't know if there are any. Okay, here's something that might be related to fermentation. Well, you know, I should take the time to make sure it's actually related. But we'll just put the name in here. And that can be a function resource, it can be another packlet. It can be a data resource. I could put sources like this. You know, I. I copied this beer ABV formula from somewhere. I should list that there. I should choose. I can provide links to other places like, you know, yeah, the beer, the Brewers Guild of America or whatever. I can say where this compatibility is, saying where I expect my packlet to work. So may. Yeah, and by default it's going to choose the version that I'm in. But maybe I know that this works in version 13.0 because I've been using it since then and I haven't really made any changes. I can limit the operating system and so on. Then we have this disclosure section. So this is important. If you want your packlet to be featured, you need to make sure that this is accurate. Um, so if this modifies local files on the user's end user's machine, I need to disclose that. If it, you know, connects to Twitter, I need to disclose that. If it modifies some system configuration like, you know, like setting $cloud base, I need to disclose that and so on and so forth. Right. If it depends on if it's going to install and use other packlets from the packlet repository, you need to disclose that. Right. So all of these are important. Right now all it does is multiplication and division. So I'm going to. I don't think I need to check any of those. And then this Author notes is useful for like, you know, casual discussion, like saying, oh, I want to, you know, this brabv function is only an approximation. I'm going to add a higher order form that's more accurate in the next update, something like that. All right, so now I filled in this notebook, I'm going to use check and that's going to go through just like in the function repository and validate all the fields. It's also going to look in the documentation notebooks, it's also going to look in the code files and it's going to find anything that it thinks is not good. All right, so here's the first one. I forgot to set the description. All right, so let's say code for brewing and drinking beer. All right, and then, and some of these have auto fixes. So this one says found one. Symbols should just say symbol. We'll fix that. That are not declared in the packlet info. And so this has an auto fix. It says add missing symbols to the packlet info. So why is it important to add the symbols? Well, it's only a little important. It if you add the symbols here, then when the packlet is installed they'll appear black and will auto complete in the front in the notebook before the pack is actually loaded, which is nice. It'll also allow us to sort of track dependencies and where functions came from. So there's sort of like second level tools that will be aided by including that there. So it's not, it's not a requirement that you listed there, but it's, it's good too. New submissions should typically be version 1.0.0. OK, no problem with that, I'll do that. Let's see what else did it find? The packlet creator is missing from the packlet info file. So this is a place where it's just trying to synchronize the definition notebook with a packlet info file. So I'll say add creator and it'll add it. So now the value here and the value here are the same. Same thing here. It wants the license information in the packlet info file. So I'll add that and I'll save it. Let's see. All right, and it's saying this does not match. Okay, so here I say 13 0. Here I'm saying 13 2. So look, it lets me choose which one I want to do. I'll go with 13 0. All right, so might have gone through all of them. I'm going to check again. I like to just keep doing check until I get A clean bill of health. Let's see. All right, so I added the description, but now it's saying that it's not in the packlet info file. So I'll do that. And that was the only one it looks like. Let's go one more time, see if I get that nice check mark here that says it couldn't find anything wrong. All right, there we go. So now I have a few things I can do now that I think my packet is good. I can use this build button or this deploy button if you do deploy, or I can do submit to repository, but I don't think I'm really ready for that yet. If you do the deploy button, it'll automatically build if it needs to. So to save time, I'm just going to do that and I'm going to say publicly in the cloud. So this is going to do a lot of things. It's going to build my documentation files. So take them from that authoring format where everything is kind of templatey and built into a nice display format for users. It's going to build an actual packlet, which is a dot packlet file which you may never need to actually direct. No one might need to directly interact with. But it's really the thing that gets distributed to users. See, it says deploying packlet archive. It's going to copy that packlet archive to the cloud. It's going to copy that built documentation to cloud objects and make a nice. It's going to build a website that links to those things. It's going to open that web page and it's, you know, everything's just going to work. And, you know, this has this click to copy that. Anybody that can access this web page can just grab and use. And I invite. And I said deploy publicly. So now this is, you know, a publicly available packlet that's distributed via the cloud. It's not in the packet repository, so you won't find it, you know, listed on, on this, this page. Right? This is in my cloud account, just deployed. The only people who will probably, probably the only people who find it will be people who watch this live stream. But maybe someone who I send the link to, I can send the link to my colleagues and say, here, I made this tool, check it out. So that's sort of cloud deployment. And if I built this out a little bit more so that I thought it was, you know, a good packlet, I could hit submit to repository and it would start that same process. But instead of putting it in my cloud account, it would put it in the public packlet repository and, you know, be more discoverable for the world. So that's sort of the process for, you know, creating packlet content for the repository. I'll go back to my presentation now. Right. So developing for the packlet repository, you need a publisher id. We talked about that. It's gotta be in all the namespaces. If you have a style sheet, the style sheet has to start with your publisher id. Same with like palette names. Sorry, all the names that users could interact with should start with your publisher id. And then we have a bunch of conventions that are all discussed in that guidelines document that's on the website that you need to meet if you want to be featured, which means your packet will appear on the homepage periodically. It's. It might be feature. We might send it out in like an email to one of our mailing lists as, you know, something to check out. We might include it in a blog. Right. There's all sorts of times where we might feature packlets and if you want to be eligible for that, you need to meet a bunch of conventions beyond like the strict requirements. So let's see. How are we doing on time? We're 45 minutes in. All right. I definitely want to have some time for questions, so let's, let's just do this in like one minute. So private resource systems, that's a possibility that can happen. You need. It's part of the private cloud. So if you have a private cloud at your organization, you could, we can put a private resource system on it with like, you know, your own functions in the function repository, your own packlets, your own data in the data repository, that sort of thing. There's this flowchart that we don't have time to look at, but it'll be in the notebook and you can study it when you download it later. Likely future repositories that are coming up in the coming months, color palettes, plot themes, examples, style sheets and. And there are many more. These are just sort of the. Probably, probably the next batch. Priorities always change though. So, so, so yeah, if you have questions about those, we can certainly talk about it. But that's. I'm going to go ahead and look at some of the questions that have come in. All right. I got a question from someone named Stumpy about is there a dedicated version property property so I can audit, so I can programmatically know if a repository item has changed? Yes. Let me just go to a normal notebook and if I say re. Resource object of. Let's See, here's one that I know has had at least. Oh, look, I don't even have the latest version installed. So this is kind of a neat thing to see. See, so this is this. If I have some, some I have version 1.0.0 in, you know, downloaded and cached locally. But there's a newer version available in the function repository. It does not automatically install it. Right. So it doesn't want to break my code if I have something that depends on the current version. It'll just keep the current version. But it will put up this notification. You can turn it off with things like quiet or off, but it, you know, this creates a nice tool for, you know, prompting and you can just click the button. So if I take this, that resource object and say version, you'll see 1.0.0. If I do this update. Let's see. Okay, so it says it's been updated. Now if I do this and I say version, it should say 2.0. And if, and I, and if you want to control exactly what version you're using, you can do this, right? And that'll ensure that it's using a specific version. So that you can definitely do that. We have some support for like, yeah, more complex like we, you know, like One Point Star or you can use like Wolfram language context, but honest. But it's not actually documented yet, but it will be. So I, yeah, we need to document it so you can know, you can do that. But if, if you're worried, you know, we want to use semantic versioning so that users can always be ensured that if the first digit doesn't change, then they can safely update. So that's, you know, that's something we have and we need to formalize and document a bit more. All right, there's another question again from STumpy, per publisher ID, how may I enable two factor authentication to ensure my account and publishing rights remain secure? Okay, so publisher IDs are all the authentication for publisher IDs is through cloud accounts or, you know, so if you have, you know, if you're authenticated, which is, which is two factor authentication. So you know, when you do Cloud connect, Cloud connect of, you know it, that will authenticate you with the Wolfram Cloud and then that authenticated, then you can make authenticated requests via OAuth to our servers and it authenticates your cloud account. And then on our server we maintain relationship between cloud accounts and publisher IDs. So you can only use a publisher ID if you're making an authenticated request. As a cloud user, with the addition that we, you can also opt in to create a token that you can then authenticate with, which is important for continuous integration and deployment. And there's entire talk available about that on YouTube that is in my links. I didn't never even got to the links, did I? All right, so there's all these links, but, and this one will go to a YouTube video all about that. So you can create a token that provides authentication for your publisher id, but it's totally up to you to create those and invalidate them as you please. And then it's up to you to kind of control it. And it isn't two factor at that point. All right, another question, there's, oh, it's another question about authentication and signing certificates, about some standard that I'm not familiar with. So I can't answer that. Sorry, I'm just, there's, there's, there's a, he's asking about x509v3. I, I, I don't, I'm not familiar with that standard, so I can't answer that. And he's asking about, he's saying this is relevant because of attacks on Python libraries where, yeah, so, right, so you know, Python libraries don't have this Publisher ID prefix. Right. So, so they don't have this level of security. So like, if, if there was a Python library, you know, like, you know, let's say Pandas is a common Python library and you know, if for whatever reason the original creator of Pandas took it down and then another person put up something called Pandas that jumped on that namespace and claimed the Pandas name and put up some malicious code, then, you know, millions of users would end up unwittingly running that code. Right. We have the publisher ID in the namespace, so we don't have that issue. It makes it a little bit less convenient because you can't just type Pandas, you have to type Bob Flash Pandas in that scenario. But you know, it, it definitely adds that layer of security. All right, here's another question Daniel asked. What's your favorite packlet in the repo? Oh, well, there's, I mean, the, the, the Continuous Integration Packlet, which is used for packlet development, is pretty great, and I hope everybody looks into that. But let's see. I, I also really like this Mockingbird one that a colleague of ours named Jesse made, where you can like create sort of like a virtual environment within the session where, you know, you have local custom definitions of functions. I find it really Useful. So I also really like, like this packlet that's choose. That's. Obviously I have to choose ones that are not mine. The two or three that I use most are probably, probably mine, but I definitely use this one and it's nice and, and I use the cic. Let's, let's, let's pick one that is made not by Wolfram staff though. Let's see. I don't know. I've definitely played around with a lot of them. The chemistry stuff is really cool, but I'm so ignorant about chemistry that I don't think I can use it well. Oh, this Telegram bot just came in the other day and it's like a chat bot tool that seems to work and it's pretty cool. So I'll pick that one too. All right, here's a question from Sakavaria or a comment that says it'd be nice if functions in the repository indicated what Wolfram language version they require. Yeah, they should. If the, if they require a Wolfram language version that's higher than something like 12.1 by default, we put that on the website. I'm going to struggle to come up with one on the. Off the top of my head. But you should notice. That like down here in this, in this section, there should be like a compatibility section for some for functions that have, that have. That require a relatively new version, something newer than the function repository itself that it should be listed there, assuming that the author has declared that in their definition notebook. All right, another question from Stumpy saying, where in the Wolfram community would you recommend to post a request for help conducting Wolfram language code and design review of packlets or resource function? All right. Yeah, so there's on community, there's one for. There's a like Wolfram add ons. I'm bad at navigating this, but there's a, well, Mathematica add ons, which I, I think we're planning to rename this like Wolfram Packlets and add ons or something. You might, you might notice a slight change in this group name actually soon I think was discussed. So don't be, don't be shocked if, if that says. But I think we're gonna keep the word term add ons in there. So this is a great place to discuss packlets and packlet development and like if you publish something packet repository, promote it here. Like you'll find, you'll find real users. I say, hey, I made this, this packlet for, you know, particle physics. Check it out. And there's also a dedicated group for function repository. It's not finding it. View all groups. Here we go. So there's, there's this dedicated group for the function repository that is great for, for, for discussing, like how to create resource functions or, you know, or even discussing particulars about a resource function. Right. So if, if, if somebody like, say, Brad Klee publishes a function, the function repository, say, hey, you know, this edge case I found, your function doesn't cover it, and it would be easy. And here's the code. This is the perfect place to sort of like directly discuss that with the author if they're on Community. All right, all right. Another comment from Daniel saying the data repository page doesn't have a recent data function. That's true. Data repository content tends to come in spurts. So the function repository content tends to kind of come in regularly. You know, we tend to publish a few things there every week, whereas data repository will, you know, go three weeks without doing it, and then we'll publish 10 things. So we've cut. We kind of played around with it and realized that it wasn't going to be super helpful without kind of reorganizing our internal processes. Maybe someday we will do that. But the way that it wouldn't be very, it wouldn't be very helpful site if we made it right now. So we decided not to. Let's see. I think I've answered all the questions. I'll take another, like 20 seconds and stare awkwardly at the camera to see if anybody else has one. Okay. No other questions. Well, thank you for joining me. You know, follow up on Wolfram Community. Publish your content. Use the content. Yeah. Have a great day.
More from Guy

Cheryl Strauss Einhorn | The Human Edge: Smarter Decisions in the Age of AI | Talks at Google

Rachel Glennerster | Innovation and the Center for Global Development | Talks at Google

Rebecca Winthrop | Rethinking the Purpose of Education in the Age of AI | Talks at Google

Dr. Robert Wachter | A Giant Leap: How AI Is Transforming Healthcare... | Talks at Google






