{"id":2345,"date":"2020-06-11T10:22:28","date_gmt":"2020-06-11T14:22:28","guid":{"rendered":"https:\/\/blogs.mathworks.com\/developer\/?p=2345"},"modified":"2020-06-11T10:22:28","modified_gmt":"2020-06-11T14:22:28","slug":"project-yourself","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/developer\/2020\/06\/11\/project-yourself\/","title":{"rendered":"Project Yourself!"},"content":{"rendered":"<div class=\"content\"><!--introduction--><p><i>Hello everyone. It has been quite a long time since we've posted anything in this forum. It's not for lack of topics though! We have many great and exciting topics to discuss, and we'd like to kick it off with a great guest post from Laura Dempsey. Laura is an application engineer in our UK office and she has a great energy and interest in how we can develop high integrity MATLAB code. She is here to discuss a feature that is both mature and established as well as new and exciting. Take it away Laura.<\/i><\/p><!--\/introduction--><p>In a <a href=\"https:\/\/blogs.mathworks.com\/developer\/2017\/01\/13\/matlab-toolbox-best-practices\/\">previous post<\/a>, Amy explained how to organize your toolbox code. Much of the advice remains the same, but the arrival of MATLAB projects in R2019a significantly advances this workflow. This post is to help you understand current best practice for organizing, testing, and deploying your MATLAB code. For more information, check out the <a href=\"https:\/\/www.mathworks.com\/solutions\/projects.html\">MATLAB and Simulink Projects<\/a> landing page on our website.<\/p><p><a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/60070-toolbox-tools\">Toolbox Tools<\/a>, which creates templates for developing new toolboxes, has also been updated on File Exchange to include MATLAB projects. Check it out after reading this blog!<\/p><p><h2><b>What are MATLAB projects?<\/b><\/h2><\/p><p>For those developing MATLAB toolboxes and applications, the process often looks like the following workflow cycle. The cycle repeats as new features, bug fixes, and more are added to the toolbox.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/developer\/files\/y2020TBT_Picture1.png\" alt=\"\"> <\/p><p>Those that have updated toolboxes, or are working collaboratively with others on toolbox development, know that it can be difficult to maintain the code base between versions and\/or developers. MATLAB projects can provide consistency and automation by helping to manage your code development environment. With MATLAB projects, you can organize toolbox code by:<\/p><div><ul><li>managing and sharing files and settings;<\/li><li>finding required files;<\/li><li>interacting with source control; and<\/li><li>simplifying test automation.<\/li><\/ul><\/div><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/developer\/files\/y2020TBT_Picture2.png\" alt=\"\"> <\/p><p>Simulink projects have existed for many years, but MATLAB projects only became available to users in R2019a (<b>Note:<\/b> they are essentially the same thing, so for the rest of the article I will simply refer to them as &#8220;projects&#8221;).<\/p><p>Defining a project (and thereby an associated project root folder) is important for toolbox development. Among other things, it provides a reproducible environment for writing and testing code. By defining this environment, a project also enables MATLAB to quickly determine dependencies and notice packaging errors. Finally, when a new version of the toolbox is ready for release, the organization capabilities of the project make it easy to automate common tasks, such as running tests and packaging.<\/p><p>If you&#8217;re still not convinced, watch how Ned Gulley and Joe Hicklin use projects in their <a href=\"https:\/\/uk.mathworks.com\/videos\/whats-new-in-matlab-r2019a-and-r2019b-1573234193257.html\">2019 MATLAB EXPO talk<\/a>.<\/p><p><h2><b>Creating a new project<\/b><\/h2><\/p><p>We&#8217;ll now run through the steps for setting up a new project using an existing toolbox. I will be using Amy&#8217;s original <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/60070-toolbox-tools\">Toolbox Tools<\/a> from the File Exchange as an example.<\/p><p>To create a new project, navigate to the home tab, then click on New -&gt; Project -&gt; <i>&lt; option &gt;<\/i>... If you already have some toolbox code that you are updating, then the &#8220;From Folder&#8221; option is probably what you need. When I click on this option, a project called <tt>Template.prj<\/tt> is created in the directory. The name &#8220;Template&#8221; matches the name of the folder I selected. This <tt>*.prj<\/tt> file must be located within the toolbox repository root.<\/p><p><i><b>Aside:<\/b> As a bonus with this command, Projects will automatically detect your version control system (VCS) if one is in place.<\/i><\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/developer\/files\/y2020TBT_Picture3.png\" alt=\"\"> <\/p><p><h2><b>Setting up your sandbox<\/b><\/h2><\/p><p><i>Path management<\/i><\/p><p>Managing the <a href=\"https:\/\/www.mathworks.com\/help\/matlab\/matlab_env\/what-is-the-matlab-search-path.html\">MATLAB search path<\/a> for your end users is important &#8211; it ensures they can use the toolbox (along with any necessary dependencies) and helps prevent conflicts with other files.  <a href=\"https:\/\/blogs.mathworks.com\/developer\/2017\/01\/13\/matlab-toolbox-best-practices\/\">Previously<\/a>, we recommended writing <tt>addsandbox()<\/tt> and <tt>rmsandbox()<\/tt> for path management. Including this step in your sandbox functions is no longer necessary, as projects allow you to specify the folders that should be on the path when the project is open. You will be prompted to select folders upon creating the project, or you can change the configuration later by clicking on &#8220;Project Path&#8221; within the Environment area of the &#8220;Project&#8221; tab. This means the MATLAB environment is set up automatically and consistently for anyone who uses that project. It also ensures we have a properly encapsulated MATLAB environment to develop our toolbox code. When you close the project, the associated folders and subfolders are removed from the path.<\/p><p><b>In summary, open a project to add toolbox folders to the path and close the project to remove them. When working on toolbox code, the project should be open.<\/b><\/p><p>With this in mind, I&#8217;m first going to remove <tt>addsandbox()<\/tt> and <tt>rmsandbox()<\/tt> from the project by right-clicking these files in the Project tab and selecting &#8220;Remove from Project.&#8221;<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/developer\/files\/y2020TBT_Picture4.png\" alt=\"\"> <\/p><p>Next, I&#8217;m going to add the folders and files specified in <tt>addsandbox()<\/tt> to the project using the &#8220;Project Path&#8221; shortcut. I need to click on &#8220;Add with Subfolders&#8230;&#8221; and select <tt>\\tbx<\/tt>.  Now whenever the project is open, these folders will be on the path. I can also go ahead and delete <tt>addsandbox()<\/tt> and <tt>rmsandbox()<\/tt>.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/developer\/files\/y2020TBT_Picture5.png\" alt=\"\"> <\/p><p><i>Startup and shutdown functions<\/i><\/p><p>If you need to perform other tasks in addition to path management, you can specify startup and shutdown functions in the project configuration. For example, check for and enable certain versions of specific dependencies, or add <tt>*.jar<\/tt> files to the Java path. As before, these settings can be accessed in the Environment area by clicking &#8220;Startup Shutdown.&#8221;<\/p><p><i>Linking to source control<\/i><\/p><p>The projects user interface provides a convenient way to use source control from within MATLAB. Git and SVN are supported as standard. As mentioned earlier, projects will automatically link to your VCS if you create a project from a folder which is already under source control. You can also create a new project from an existing git or SVN repository if you specify the remote location.<\/p><p><h2><b>Default toolbox development structure<\/b><\/h2><\/p><p>We previously gave a blueprint for <a href=\"https:\/\/blogs.mathworks.com\/developer\/2017\/01\/13\/matlab-toolbox-best-practices\/\">how to organize your sandbox<\/a> and <a href=\"https:\/\/blogs.mathworks.com\/developer\/2017\/03\/10\/apps-in-toolboxes\/\">where to place an app within a toolbox<\/a>. With projects now integrated in our toolbox development workflow, we need to update this blueprint. The following shows our new organization suggestion; folders within the root directory are shown in bold for clarity. Orange items are packaged and shipped as an <tt>*.mltbx<\/tt>.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/developer\/files\/y2020TBT_Picture5a.png\" alt=\"\"> <\/p><p>One thing you may have noticed is that upon creating a new project, a <tt>\/resources<\/tt> folder is created in the root directory. This folder contains files necessary for the project and should not be modified.<\/p><p><h2><b>Sharing code<\/b><\/h2><\/p><p>Projects also makes sharing your toolbox code easy. We can create a toolbox with a couple clicks from the &#8220;Share&#8221; menu of the &#8220;Project&#8221; tab.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/developer\/files\/y2020TBT_Picture6.png\" alt=\"\"> <\/p><p>Projects prepopulates the information for your toolbox, such as the description, necessary files, and what folders need to be on the path. You should only package your <tt>tbx<\/tt> folder and associated subfolders, not the other files and folders in your project root directory. These packaging configuration settings are stored within the <tt>myToolbox.prj<\/tt> file, where it is also possible to change the version number, toolbox icon, and more.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/developer\/files\/y2020TBT_Picture7.png\" alt=\"\"> <\/p><p>You can also create this toolbox packaging configuration file from the Add-Ons menu in the Home tab:<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/developer\/files\/y2020TBT_Picture8.png\" alt=\"\"> <\/p><p>For more control over the packaging process, we recommend writing a <tt>release()<\/tt> function and adding it as a project shortcut. For example, <tt>release()<\/tt> could automatically extract the version information from <tt>myToolbox.prj<\/tt>, create and rename the resulting <tt>*.mltbx<\/tt> file, and place it in the <tt>\/releases<\/tt> folder.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/developer\/files\/y2020TBT_Picture9.png\" alt=\"\"> <\/p><pre class=\"language-matlab\"><span class=\"keyword\">function<\/span> release()\r\n<span class=\"comment\">% release packages the toolbox and stores it in a release folder.<\/span>\r\nfolder = fileparts( mfilename( <span class=\"string\">\"fullpath\"<\/span> ) );\r\ntlbxPrj = fullfile( folder, <span class=\"string\">\"myToolbox.prj\"<\/span> );\r\nversion = matlab.addons.toolbox.toolboxVersion( tlbxPrj );\r\nmltbx = fullfile( folder, <span class=\"string\">\"releases\"<\/span>, <span class=\"keyword\">...<\/span>\r\n    <span class=\"string\">\"myToolbox \"<\/span> + version + <span class=\"string\">\".mltbx\"<\/span> );\r\nmatlab.addons.toolbox.packageToolbox( tlbxPrj, mltbx );\r\n<span class=\"keyword\">end<\/span> <span class=\"comment\">% release<\/span>\r\n<\/pre><p><h2><b>Try it!<\/b><\/h2><\/p><p>Future blog posts will cover how to take advantage of projects to help automate and expedite testing your code. For now, give projects a try and let us know what you think by leaving a comment below. Don't forget to also download the new <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/60070-toolbox-tools\">Toolbox Tools<\/a>!<\/p><script language=\"JavaScript\"> <!-- \r\n    function grabCode_94c91f80ccfb44c284884fb1083b0cc6() {\r\n        \/\/ Remember the title so we can use it in the new page\r\n        title = document.title;\r\n\r\n        \/\/ Break up these strings so that their presence\r\n        \/\/ in the Javascript doesn't mess up the search for\r\n        \/\/ the MATLAB code.\r\n        t1='94c91f80ccfb44c284884fb1083b0cc6 ' + '##### ' + 'SOURCE BEGIN' + ' #####';\r\n        t2='##### ' + 'SOURCE END' + ' #####' + ' 94c91f80ccfb44c284884fb1083b0cc6';\r\n    \r\n        b=document.getElementsByTagName('body')[0];\r\n        i1=b.innerHTML.indexOf(t1)+t1.length;\r\n        i2=b.innerHTML.indexOf(t2);\r\n \r\n        code_string = b.innerHTML.substring(i1, i2);\r\n        code_string = code_string.replace(\/REPLACE_WITH_DASH_DASH\/g,'--');\r\n\r\n        \/\/ Use \/x3C\/g instead of the less-than character to avoid errors \r\n        \/\/ in the XML parser.\r\n        \/\/ Use '\\x26#60;' instead of '<' so that the XML parser\r\n        \/\/ doesn't go ahead and substitute the less-than character. \r\n        code_string = code_string.replace(\/\\x3C\/g, '\\x26#60;');\r\n\r\n        copyright = 'Copyright 2020 The MathWorks, Inc.';\r\n\r\n        w = window.open();\r\n        d = w.document;\r\n        d.write('<pre>\\n');\r\n        d.write(code_string);\r\n\r\n        \/\/ Add copyright line at the bottom if specified.\r\n        if (copyright.length > 0) {\r\n            d.writeln('');\r\n            d.writeln('%%');\r\n            if (copyright.length > 0) {\r\n                d.writeln('% _' + copyright + '_');\r\n            }\r\n        }\r\n\r\n        d.write('<\/pre>\\n');\r\n\r\n        d.title = title + ' (MATLAB code)';\r\n        d.close();\r\n    }   \r\n     --> <\/script><p style=\"text-align: right; font-size: xx-small; font-weight:lighter;   font-style: italic; color: gray\"><br><a href=\"javascript:grabCode_94c91f80ccfb44c284884fb1083b0cc6()\"><span style=\"font-size: x-small;        font-style: italic;\">Get \r\n      the MATLAB code <noscript>(requires JavaScript)<\/noscript><\/span><\/a><br><br>\r\n      Published with MATLAB&reg; R2020a<br><\/p><\/div><!--\r\n94c91f80ccfb44c284884fb1083b0cc6 ##### SOURCE BEGIN #####\r\n%%\r\n% _Hello everyone. It has been quite a long time since we've posted\r\n% anything in this forum. It's not for lack of topics though! We have many\r\n% great and exciting topics to discuss, and we'd like to kick it off with a\r\n% great guest post from Laura Dempsey. Laura is an application engineer in\r\n% our UK office and she has a great energy and interest in how we can\r\n% develop high integrity MATLAB code. She is here to discuss a feature that\r\n% is both mature and established as well as new and exciting. Take it away\r\n% Laura._\r\n%\r\n%%\r\n%\r\n% In a <https:\/\/blogs.mathworks.com\/developer\/2017\/01\/13\/matlab-toolbox-best-practices\/ \r\n% previous post>, Amy explained how to organize your toolbox code. Much of the \r\n% advice remains the same, but the arrival of MATLAB projects in R2019a significantly \r\n% advances this workflow. This post is to help you understand current best practice \r\n% for organizing, testing, and deploying your MATLAB code. For more information, \r\n% check out the <https:\/\/www.mathworks.com\/solutions\/projects.html MATLAB and \r\n% Simulink Projects> landing page on our website.\r\n%\r\n% <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/60070-toolbox-tools\r\n% Toolbox Tools>, which creates templates for developing new toolboxes, has\r\n% also been updated on File Exchange to include MATLAB projects. Check it\r\n% out after reading this blog!\r\n%\r\n%%\r\n%\r\n% *What are MATLAB projects?*\r\n%\r\n% For those developing MATLAB toolboxes and applications, the process often \r\n% looks like the following workflow cycle. The cycle repeats as new features, \r\n% bug fixes, and more are added to the toolbox.\r\n% \r\n% <<y2020TBT_Picture1.png>>\r\n% \r\n% Those that have updated toolboxes, or are working collaboratively with others \r\n% on toolbox development, know that it can be difficult to maintain the code base \r\n% between versions and\/or developers. MATLAB projects can provide consistency \r\n% and automation by helping to manage your code development environment. With \r\n% MATLAB projects, you can organize toolbox code by:\r\n%%\r\n% * managing and sharing files and settings;\r\n% * finding required files;\r\n% * interacting with source control; and\r\n% * simplifying test automation.\r\n%% \r\n% <<y2020TBT_Picture2.png>>\r\n% \r\n% Simulink projects have existed for many years, but MATLAB projects only became \r\n% available to users in R2019a (*Note:* they are essentially the same thing, so \r\n% for the rest of the article I will simply refer to them as \u201cprojects\u201d). \r\n% \r\n% Defining a project (and thereby an associated project root folder) is important \r\n% for toolbox development. Among other things, it provides a reproducible environment \r\n% for writing and testing code. By defining this environment, a project also enables \r\n% MATLAB to quickly determine dependencies and notice packaging errors. Finally, \r\n% when a new version of the toolbox is ready for release, the organization capabilities \r\n% of the project make it easy to automate common tasks, such as running tests \r\n% and packaging.\r\n% \r\n% If you\u2019re still not convinced, watch how Ned Gulley and Joe Hicklin use projects \r\n% in their <https:\/\/uk.mathworks.com\/videos\/whats-new-in-matlab-r2019a-and-r2019b-1573234193257.html \r\n% 2019 MATLAB EXPO talk>.\r\n%\r\n%%\r\n% *Creating a new project*\r\n%\r\n% We\u2019ll now run through the steps for setting up a new project using an existing \r\n% toolbox. I will be using Amy\u2019s original <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/60070-toolbox-tools \r\n% Toolbox Tools> from the File Exchange as an example.\r\n% \r\n% To create a new project, navigate to the home tab, then click on New -> Project \r\n% -> _< option >_... If you already have some toolbox code that you are updating, then \r\n% the \u201cFrom Folder\u201d option is probably what you need. When I click on this option, \r\n% a project called |Template.prj| is created in the directory. The name \u201cTemplate\u201d \r\n% matches the name of the folder I selected. This |*.prj| file must be located \r\n% within the toolbox repository root.\r\n% \r\n% _*Aside:* As a bonus with this command, Projects will automatically detect \r\n% your version control system (VCS) if one is in place._\r\n%\r\n% <<y2020TBT_Picture3.png>>\r\n%\r\n%%\r\n%\r\n% *Setting up your sandbox* \r\n% \r\n% _Path management_\r\n% \r\n% Managing the <https:\/\/www.mathworks.com\/help\/matlab\/matlab_env\/what-is-the-matlab-search-path.html \r\n% MATLAB search path> for your end users is important \u2013 it ensures they can use \r\n% the toolbox (along with any necessary dependencies) and helps prevent conflicts \r\n% with other files.  <https:\/\/blogs.mathworks.com\/developer\/2017\/01\/13\/matlab-toolbox-best-practices\/ \r\n% Previously>, we recommended writing |addsandbox()| and |rmsandbox()| for path \r\n% management. Including this step in your sandbox functions is no longer necessary, \r\n% as projects allow you to specify the folders that should be on the path when \r\n% the project is open. You will be prompted to select folders upon creating the \r\n% project, or you can change the configuration later by clicking on \u201cProject Path\u201d \r\n% within the Environment area of the \u201cProject\u201d tab. This means the MATLAB environment \r\n% is set up automatically and consistently for anyone who uses that project. It \r\n% also ensures we have a properly encapsulated MATLAB environment to develop our \r\n% toolbox code. When you close the project, the associated folders and subfolders \r\n% are removed from the path.\r\n% \r\n% *In summary, open a project to add toolbox folders to the path and close the \r\n% project to remove them. When working on toolbox code, the project should be \r\n% open.*\r\n% \r\n% With this in mind, I\u2019m first going to remove |addsandbox()| and |rmsandbox()| \r\n% from the project by right-clicking these files in the Project tab and selecting \r\n% \u201cRemove from Project.\u201d\r\n%\r\n% <<y2020TBT_Picture4.png>>\r\n% \r\n% Next, I\u2019m going to add the folders and files specified in |addsandbox()| to \r\n% the project using the \u201cProject Path\u201d shortcut. I need to click on \u201cAdd with \r\n% Subfolders\u2026\u201d and select |\\tbx|.  Now whenever the project is open, these folders \r\n% will be on the path. I can also go ahead and delete |addsandbox()| and |rmsandbox()|.\r\n%\r\n% <<y2020TBT_Picture5.png>>\r\n% \r\n% _Startup and shutdown functions_\r\n% \r\n% If you need to perform other tasks in addition to path management, you can \r\n% specify startup and shutdown functions in the project configuration. For example, \r\n% check for and enable certain versions of specific dependencies, or add |*.jar| \r\n% files to the Java path. As before, these settings can be accessed in the Environment \r\n% area by clicking \u201cStartup Shutdown.\u201d\r\n% \r\n% _Linking to source control_\r\n% \r\n% The projects user interface provides a convenient way to use source control \r\n% from within MATLAB. Git and SVN are supported as standard. As mentioned earlier, \r\n% projects will automatically link to your VCS if you create a project from a \r\n% folder which is already under source control. You can also create a new project \r\n% from an existing git or SVN repository if you specify the remote location. \r\n%\r\n%%\r\n%\r\n% *Default toolbox development structure*\r\n% \r\n% We previously gave a blueprint for <https:\/\/blogs.mathworks.com\/developer\/2017\/01\/13\/matlab-toolbox-best-practices\/ \r\n% how to organize your sandbox> and <https:\/\/blogs.mathworks.com\/developer\/2017\/03\/10\/apps-in-toolboxes\/ \r\n% where to place an app within a toolbox>. With projects now integrated in our \r\n% toolbox development workflow, we need to update this blueprint. The following \r\n% shows our new organization suggestion; folders within the root directory are \r\n% shown in bold for clarity. Orange items are packaged and shipped as an |*.mltbx|. \r\n% \r\n% <<y2020TBT_Picture5a.png>>\r\n% \r\n% One thing you may have noticed is that upon creating a new project, a |\/resources| \r\n% folder is created in the root directory. This folder contains files necessary \r\n% for the project and should not be modified.\r\n%%\r\n%\r\n% *Sharing code*\r\n%\r\n% Projects also makes sharing your toolbox code easy. We can create a toolbox \r\n% with a couple clicks from the \u201cShare\u201d menu of the \u201cProject\u201d tab. \r\n%\r\n% <<y2020TBT_Picture6.png>>\r\n% \r\n% Projects prepopulates the information for your toolbox, such as the description, \r\n% necessary files, and what folders need to be on the path. You should only package \r\n% your |tbx| folder and associated subfolders, not the other files and folders \r\n% in your project root directory. These packaging configuration settings are stored \r\n% within the |myToolbox.prj| file, where it is also possible to change the version \r\n% number, toolbox icon, and more.\r\n%\r\n% <<y2020TBT_Picture7.png>>\r\n% \r\n% You can also create this toolbox packaging configuration file from the Add-Ons \r\n% menu in the Home tab:\r\n% \r\n% <<y2020TBT_Picture8.png>>\r\n% \r\n% For more control over the packaging process, we recommend writing a\r\n% |release()| function and adding it as a project shortcut. For example,\r\n% |release()| could automatically extract the version information from\r\n% |myToolbox.prj|, create and rename the resulting |*.mltbx| file, and\r\n% place it in the |\/releases| folder.\r\n%\r\n% <<y2020TBT_Picture9.png>>\r\n% \r\n% \r\n%   function release()\r\n%   % release packages the toolbox and stores it in a release folder.  \r\n%   folder = fileparts( mfilename( \"fullpath\" ) );\r\n%   tlbxPrj = fullfile( folder, \"myToolbox.prj\" );\r\n%   version = matlab.addons.toolbox.toolboxVersion( tlbxPrj );\r\n%   mltbx = fullfile( folder, \"releases\", ...\r\n%       \"myToolbox \" + version + \".mltbx\" );\r\n%   matlab.addons.toolbox.packageToolbox( tlbxPrj, mltbx );  \r\n%   end % release\r\n% \r\n%%\r\n%\r\n% *Try it!*\r\n%\r\n% Future blog posts will cover how to take advantage of projects to help automate \r\n% and expedite testing your code. For now, give projects a try and let us know \r\n% what you think by leaving a comment below. Don't forget to also download the \r\n% new <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/60070-toolbox-tools \r\n% Toolbox Tools>!\r\n##### SOURCE END ##### 94c91f80ccfb44c284884fb1083b0cc6\r\n-->","protected":false},"excerpt":{"rendered":"<div class=\"overview-image\"><img decoding=\"async\"  class=\"img-responsive\" src=\"https:\/\/blogs.mathworks.com\/developer\/files\/y2020TBT_Picture1.png\" onError=\"this.style.display ='none';\" \/><\/div><!--introduction--><p><i>Hello everyone. It has been quite a long time since we've posted anything in this forum. It's not for lack of topics though! We have many great and exciting topics to discuss, and we'd like to kick it off with a great guest post from Laura Dempsey. Laura is an application engineer in our UK office and she has a great energy and interest in how we can develop high integrity MATLAB code. She is here to discuss a feature that is both mature and established as well as new and exciting. Take it away Laura.<\/i>... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/developer\/2020\/06\/11\/project-yourself\/\">read more >><\/a><\/p>","protected":false},"author":90,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[31,33],"tags":[],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/posts\/2345"}],"collection":[{"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/users\/90"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/comments?post=2345"}],"version-history":[{"count":11,"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/posts\/2345\/revisions"}],"predecessor-version":[{"id":2449,"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/posts\/2345\/revisions\/2449"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/media?parent=2345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/categories?post=2345"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/tags?post=2345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}