{"id":255,"date":"2010-11-18T14:12:29","date_gmt":"2010-11-18T14:12:29","guid":{"rendered":"https:\/\/blogs.mathworks.com\/loren\/2010\/11\/18\/deploying-standalone-applications\/"},"modified":"2017-08-07T15:09:06","modified_gmt":"2017-08-07T20:09:06","slug":"deploying-standalone-applications","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/loren\/2010\/11\/18\/deploying-standalone-applications\/","title":{"rendered":"Deploying Standalone Applications"},"content":{"rendered":"<div xmlns:mwsh=\"https:\/\/www.mathworks.com\/namespace\/mcode\/v1\/syntaxhighlight.dtd\" class=\"content\">\r\n   <introduction>\r\n      <p>Guest blogger <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/authors\/4660\">Peter Webb<\/a> returns with another in an <a href=\"https:\/\/blogs.mathworks.com\/loren\/category\/deployment\/\">occasional series<\/a> of postings about application deployment.\r\n      <\/p>\r\n   <\/introduction>\r\n   <h3>Contents<\/h3>\r\n   <div>\r\n      <ul>\r\n         <li><a href=\"#2\">Application Deployment<\/a><\/li>\r\n         <li><a href=\"#3\">Creating a Standalone Executable<\/a><\/li>\r\n         <li><a href=\"#8\">How Can I Help?<\/a><\/li>\r\n      <\/ul>\r\n   <\/div>\r\n   <p>In the first four articles in this series, I addressed some of the differences between MATLAB and deployed runtime environment.\r\n      With the next set, I'll be talking more about the features of our <a href=\"https:\/\/www.mathworks.com\/products\/compiler\">deployment tools<\/a>, and how you use them to create deployable applications. Of necessity, I'm limiting myself to discussing the <a title=\"https:\/\/www.mathworks.com\/solutions\/technical-computing.html (link no longer works)\">technical computing tools<\/a> because that's where my expertise lies. Even though the term ''application deployment'' applies to <a href=\"https:\/\/www.mathworks.com\/solutions\/control-systems.html\">control design<\/a> tools like <a href=\"https:\/\/www.mathworks.com\/products\/rtw\">Real Time Workshop<\/a> and Embedded MATLAB, I won't post about those tools here. You can read about code generation for control design applications in Seth Popinchalk's\r\n      <a href=\"https:\/\/blogs.mathworks.com\/seth\/\">Seth on Simulink<\/a> blog. By concentrating on the deployment process, I hope to complement the other articles in Loren's blog -- she'll show\r\n      you how to write interesting MATLAB programs, and I'll help you turn them into deployable applications.\r\n   <\/p>\r\n   <p>I'd like to to host a conversation here: a real two-way exchange of ideas. I'll post articles that will make it easier, and\r\n      perhaps even more fun, to use the MATLAB Compiler and the Builders. I hope you'll respond with questions where you have them, praise where it's merited, and especially complaints and suggestions\r\n      -- your feedback here will help us improve the tools you use.\r\n   <\/p>\r\n   <p>In this post, I'm going to briefly introduce the most important application deployment concepts, and then demonstrate how\r\n      to use the MATLAB Compiler to turn an MATLAB function into a standalone executable.\r\n   <\/p>\r\n   <h3>Application Deployment<a name=\"2\"><\/a><\/h3>\r\n   <p>Our deployment tools all focus on the same basic process: transforming a collection of functions written in <a href=\"https:\/\/www.mathworks.com\/products\/matlab\">MATLAB<\/a> into an application or library that can be used outside of MATLAB.\r\n   <\/p>\r\n   <p>The MATLAB Compiler and Builders allow you to deploy MATLAB applications as:<\/p>\r\n   <div>\r\n      <ul>\r\n         <li>Stand-alone executables<\/li>\r\n         <li>C or C++ libraries<\/li>\r\n         <li>Microsoft .NET or COM components (local or remote)<\/li>\r\n         <li>Java classes<\/li>\r\n         <li>Microsoft Excel add-ins<\/li>\r\n      <\/ul>\r\n   <\/div>\r\n   <p>A <i>deployed application<\/i> consists of a collection of MATLAB-based functions and data packaged for a particular <i>target environment<\/i>. For example, the MATLAB Compiler can package MATLAB-based functions into C++ shared libraries so they can be called in any\r\n      programming environment that supports C++ functions.\r\n   <\/p>\r\n   <p>All of our tools follow the same four step process to create a deployed application:<\/p>\r\n   <li>Examine the application to determine which MATLAB-based files to ship.<\/li>\r\n   <li>Generate interface (<i>wrapper<\/i>) functions for the target environment.\r\n   <\/li>\r\n   <li>Invoke a target environment specific build tool (like a C++ or Java compiler) to create an executable or software component.<\/li>\r\n   <li>Assemble the MATLAB-based files and the binary generated in step 3 into one or more files for distribution.<\/li>\r\n   <p>The deployment tools create an application you can install on a machine without MATLAB. But in order to run, the application\r\n      requires a runtime library (like Java programs require a Java installation). Our runtime library is called the <a href=\"https:\/\/www.mathworks.com\/help\/releases\/R2010b\/toolbox\/compiler\/f12-999353.html\"><i>MATLAB Compiler Runtime<\/i><\/a>, or more commonly, the <i>MCR<\/i>. An installer for the MCR ships with the MATLAB Compiler and Builders. You can redistribute this installer to your end users.\r\n   <\/p>\r\n   <h3>Creating a Standalone Executable<a name=\"3\"><\/a><\/h3>\r\n   <p>A <a href=\"https:\/\/www.mathworks.com\/help\/releases\/R2010b\/toolbox\/compiler\/bsmbyn0.html\"><i>standalone executable<\/i><\/a> is a complete program that you can run from the Unix command line or Microsoft Windows DOS command prompt. Standalone executables\r\n      are a convenient way to provide turn-key MATLAB-based solutions to your colleagues or end users.\r\n   <\/p>\r\n   <p>Save this MATLAB function as <tt>helloworld.m<\/tt>. Before compiling it, test it in MATLAB. It should produce a globe with the continents visible and the view centered on the\r\n      mid-Atlantic trench.\r\n   <\/p><pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid rgb(200,200,200)\"><span style=\"color: #0000FF\">function<\/span> helloworld\r\n<span style=\"color: #228B22\">% HELLOWORLD Display the globe and a welcome message.<\/span>\r\n\r\n    <span style=\"color: #228B22\">% Load the topographical data for the globe<\/span>\r\n    load(<span style=\"color: #A020F0\">'topo.mat'<\/span>, <span style=\"color: #A020F0\">'topo'<\/span>, <span style=\"color: #A020F0\">'topomap1'<\/span>);\r\n\r\n    <span style=\"color: #228B22\">% Create a unit sphere with 50 facets. This sphere is the Earth.<\/span>\r\n    [x,y,z] = sphere(50);\r\n\r\n    <span style=\"color: #228B22\">% Establish initial viewing and lighting parameters. Use Phong shading<\/span>\r\n    <span style=\"color: #228B22\">% and texture mapping to wrap the topo map data around the sphere.<\/span>\r\n\r\n    props.FaceColor= <span style=\"color: #A020F0\">'texture'<\/span>;\r\n    props.EdgeColor = <span style=\"color: #A020F0\">'none'<\/span>;\r\n    props.FaceLighting = <span style=\"color: #A020F0\">'phong'<\/span>;\r\n    props.CData = topo;\r\n\r\n    <span style=\"color: #228B22\">% Set the viewpoint to look at the Atlantic Ocean.<\/span>\r\n    view(-130, 10);\r\n\r\n    <span style=\"color: #228B22\">% Draw the sphere, with the topo data texture mapped to the surface.<\/span>\r\n    s=surface(x,y,z,props);\r\n    set(gcf, <span style=\"color: #A020F0\">'Color'<\/span>, <span style=\"color: #A020F0\">'white'<\/span>);  <span style=\"color: #228B22\">% White background<\/span>\r\n    axis <span style=\"color: #A020F0\">square<\/span>\r\n    axis <span style=\"color: #A020F0\">off<\/span>\r\n    axis <span style=\"color: #A020F0\">equal<\/span>\r\n\r\n    title(<span style=\"color: #A020F0\">'Hello, World.'<\/span>, <span style=\"color: #A020F0\">'FontSize'<\/span>, 14, <span style=\"color: #A020F0\">'FontWeight'<\/span>, <span style=\"color: #A020F0\">'Bold'<\/span>);\r\n<span style=\"color: #0000FF\">end<\/span><\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/images\/loren\/255\/Welcome_01.png\"> <p>Build this function into a standalone application with the MATLAB Compiler:<\/p><pre>  mcc -mv helloworld.m -a topo.mat<\/pre><p>Here, I've specified three groups of arguments to the <a href=\"https:\/\/www.mathworks.com\/help\/releases\/R2010b\/toolbox\/compiler\/mcc.html\"><tt>mcc<\/tt><\/a> command:\r\n   <\/p>\r\n   <div>\r\n      <ul>\r\n         <li><tt>-mv<\/tt>: <tt>-m<\/tt> means create a ''main'' program, a standalone executable. <tt>-v<\/tt> requests verbose output.\r\n         <\/li>\r\n         <li><tt>helloworld.m<\/tt>: The name of the MATLAB function to compile. The generated executable takes its name from the name of the first MATLAB function\r\n            specified on the command line.\r\n         <\/li>\r\n         <li><tt>-a topo.mat<\/tt>: <tt>-a<\/tt> stands for ''additional file''; it is typically used to add data files to the application.\r\n         <\/li>\r\n      <\/ul>\r\n   <\/div>\r\n   <p>This <tt>mcc<\/tt> command will create a standalone executable called <tt>helloworld<\/tt> on UNIX systems, <tt>helloworld.exe<\/tt> on PCs running Microsoft Windows.\r\n   <\/p>\r\n   <p>In order to run the executable, the operating system needs to be able to find the MCR. You need to put the MCR's <tt>runtime\/&lt;architecture&gt;<\/tt> directory on the system's <a href=\"https:\/\/www.mathworks.com\/help\/releases\/R2010b\/toolbox\/compiler\/f12-999353.html#br2jauc-33\">library search path<\/a>. On Windows, you add it to the <tt>PATH<\/tt> environment variable. On Unix, you add it to <tt>LD_LIBRARY_PATH<\/tt> (except on the MacIntosh, which uses <tt>DYLD_LIBRARY_PATH<\/tt>). To run the executable locally (on the machine where you created it), use MATLAB's <tt>runtime\/&lt;architecture&gt;<\/tt> directory. If the environment variable <tt>MATLAB_ROOT<\/tt> indicates the root of your MATLAB installation, add the <tt>runtime<\/tt> directory to the library search path with one of the following commands\r\n   <\/p><pre>Linux 32-bit:\r\n  % setenv LD_LIBRARY_PATH $MATLAB_ROOT\/runtime\/glnx86<\/pre><pre>Windows:\r\n  c:\\Work&gt; set %PATH%;%MATLAB_ROOT%\\runtime\\win32<\/pre><p>Then, run the application:<\/p><pre>UNIX:\r\n  % helloworld<\/pre><pre>Windows:\r\n  c:\\Work&gt; helloworld.exe<\/pre><p>You should see a single window displaying a map of the world.<\/p>\r\n   <h3>How Can I Help?<a name=\"8\"><\/a><\/h3>\r\n   <p>Writing applications for deployment requires a new set of skills. There are differences between the MATLAB interactive environment\r\n      and the DOS and Unix command lines that I can't (and don't want to) erase. But I do want to make the deployment process as\r\n      painless as possible. Let me know how we're doing. Tell me what we've done right, and how we could improve. I've got a long\r\n      list of topics lined up for future postings, but I'm very interested in hearing what you'd like to know. <a href=\"https:\/\/blogs.mathworks.com\/loren\/?p=255#respond\">Reply<\/a> to this posting and let's get started.\r\n   <\/p><script language=\"JavaScript\">\r\n<!--\r\n\r\n    function grabCode_43ee8f747f2b437382f6f4aec220a80b() {\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='43ee8f747f2b437382f6f4aec220a80b ' + '##### ' + 'SOURCE BEGIN' + ' #####';\r\n        t2='##### ' + 'SOURCE END' + ' #####' + ' 43ee8f747f2b437382f6f4aec220a80b';\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        author = 'Peter Webb';\r\n        copyright = 'Copyright 2010 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 author and copyright lines at the bottom if specified.\r\n        if ((author.length > 0) || (copyright.length > 0)) {\r\n            d.writeln('');\r\n            d.writeln('%%');\r\n            if (author.length > 0) {\r\n                d.writeln('% _' + author + '_');\r\n            }\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      \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_43ee8f747f2b437382f6f4aec220a80b()\"><span style=\"font-size: x-small;        font-style: italic;\">Get \r\n            the MATLAB code \r\n            <noscript>(requires JavaScript)<\/noscript><\/span><\/a><br><br>\r\n      Published with MATLAB&reg; 7.11<br><\/p>\r\n<\/div>\r\n<!--\r\n43ee8f747f2b437382f6f4aec220a80b ##### SOURCE BEGIN #####\r\n%% Deploying Standalone Applications\r\n% Guest blogger \r\n% <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/authors\/4660 Peter Webb>\r\n% returns with another in an \r\n% <https:\/\/blogs.mathworks.com\/loren\/category\/deployment\/ occasional series>\r\n% of postings about application deployment. \r\n\r\n%%\r\n% In the first four articles in this series, I addressed some of the\r\n% differences between MATLAB and deployed runtime environment. With the\r\n% next set, I'll be talking more about the features of our \r\n% <https:\/\/www.mathworks.com\/products\/compiler deployment tools>,\r\n% and how you use them to create deployable applications. Of\r\n% necessity, I'm limiting myself to discussing the \r\n% <https:\/\/www.mathworks.com\/solutions\/technical-computing.html technical\r\n% computing tools> because that's where my expertise lies. Even though the\r\n% term ''application deployment'' applies to \r\n% <https:\/\/www.mathworks.com\/solutions\/control-systems.html control design>\r\n% tools like <https:\/\/www.mathworks.com\/products\/rtw Real Time Workshop> and\r\n% <https:\/\/www.mathworks.com\/products.htmlfeatured\/embeddedmatlab\/index.html\r\n% Embedded MATLAB>, I won't post about those tools here. You can read\r\n% about code generation for control design applications in Seth\r\n% Popinchalk's <https:\/\/blogs.mathworks.com\/seth\/ Seth on Simulink> blog.\r\n% By concentrating on the deployment process, I hope to complement the other\r\n% articles in Loren's blog REPLACE_WITH_DASH_DASH she'll show you how to write interesting \r\n% MATLAB programs, and I'll help you turn them into deployable applications.\r\n% \r\n% I'd like to to host a conversation here: a real two-way exchange of\r\n% ideas. I'll post articles that will make it easier, and \r\n% perhaps even more fun, to use the  \r\n% <https:\/\/www.mathworks.com\/solutions\/desktop-web-deployment.html\/deploying-code-executable-software-component.html \r\n% MATLAB Compiler and the Builders>.\r\n% I hope you'll respond with questions where you have them, praise \r\n% where it's merited, and especially complaints and suggestions REPLACE_WITH_DASH_DASH \r\n% your feedback here will help us improve the tools you use.\r\n%\r\n% In this post, I'm going to briefly introduce the most\r\n% important application deployment concepts, and then demonstrate how to\r\n% use the MATLAB Compiler to turn an MATLAB function into a standalone \r\n% executable.\r\n\r\n%% Application Deployment\r\n% Our deployment tools all focus on the same basic process: \r\n% transforming a collection of functions written in \r\n% <https:\/\/www.mathworks.com\/products\/matlab MATLAB> into an application or\r\n% library that can be used outside of MATLAB. \r\n%\r\n% The MATLAB Compiler and Builders allow you to deploy MATLAB \r\n% applications as:\r\n%\r\n% * Stand-alone executables\r\n% * C or C++ libraries\r\n% * Microsoft .NET or COM components (local or remote)\r\n% * Java classes\r\n% * Microsoft Excel add-ins\r\n% \r\n% A _deployed application_ consists of a collection of MATLAB-based\r\n% functions and data packaged for a particular _target environment_. For\r\n% example, the MATLAB Compiler can package MATLAB-based functions into\r\n% C++ shared libraries so they can be called in any programming environment\r\n% that supports C++ functions.\r\n%\r\n% All of our tools follow the same four step process to create a deployed\r\n% application:\r\n%\r\n% # Examine the application to determine which MATLAB-based files to ship.\r\n% # Generate interface (_wrapper_) functions for the target environment.\r\n% # Invoke a target environment specific build tool (like a C++ or Java\r\n% compiler) to create an executable or software component.\r\n% # Assemble the MATLAB-based files and the binary generated in step 3 into\r\n% one or more files for distribution.\r\n%\r\n% The deployment tools create an application you can install on a machine\r\n% without MATLAB. But in order to run, the application requires a runtime\r\n% library (like Java programs require a Java installation). Our runtime\r\n% library is called the \r\n% <https:\/\/www.mathworks.com\/help\/releases\/R2010b\/toolbox\/compiler\/f12-999353.html \r\n% _MATLAB Compiler Runtime_>, or more commonly, the _MCR_. An installer for\r\n% the MCR ships with the MATLAB Compiler and Builders. You can redistribute\r\n% this installer to your end users.\r\n\r\n%% Creating a Standalone Executable\r\n% A <https:\/\/www.mathworks.com\/help\/releases\/R2010b\/toolbox\/compiler\/bsmbyn0.html \r\n% _standalone executable_> is a complete program that you can run from the\r\n% Unix command line or Microsoft Windows DOS command prompt. Standalone\r\n% executables are a convenient way to provide turn-key MATLAB-based\r\n% solutions to your colleagues or end users. \r\n%\r\n% Save this MATLAB function as |helloworld.m|. Before compiling it, test it in MATLAB. It\r\n% should produce a globe with the continents visible and the view \r\n% centered on the mid-Atlantic trench.\r\n\r\nfunction helloworld\r\n% HELLOWORLD Display the globe and a welcome message.\r\n\r\n    % Load the topographical data for the globe\r\n    load('topo.mat', 'topo', 'topomap1');\r\n\r\n    % Create a unit sphere with 50 facets. This sphere is the Earth.\r\n    [x,y,z] = sphere(50);\r\n    \r\n    % Establish initial viewing and lighting parameters. Use Phong shading \r\n    % and texture mapping to wrap the topo map data around the sphere.\r\n\r\n    props.FaceColor= 'texture';\r\n    props.EdgeColor = 'none';\r\n    props.FaceLighting = 'phong';\r\n    props.CData = topo;\r\n    \r\n    % Set the viewpoint to look at the Atlantic Ocean.\r\n    view(-130, 10);\r\n\r\n    % Draw the sphere, with the topo data texture mapped to the surface.\r\n    s=surface(x,y,z,props);\r\n    set(gcf, 'Color', 'white');  % White background\r\n    axis square\r\n    axis off\r\n    axis equal\r\n\r\n    title('Hello, World.', 'FontSize', 14, 'FontWeight', 'Bold');\r\nend\r\n\r\n%% \r\n% Build this function into a standalone application with the MATLAB\r\n% Compiler:\r\n%\r\n%    mcc -mv helloworld.m -a topo.mat\r\n%\r\n\r\n%%\r\n% Here, I've specified three groups of arguments to the \r\n% <https:\/\/www.mathworks.com\/help\/releases\/R2010b\/toolbox\/compiler\/mcc.html \r\n% |mcc|> command: \r\n%\r\n% * |-mv|: |-m| means create a ''main'' program, a standalone executable.\r\n% |-v| requests verbose output.\r\n% * |helloworld.m|: The name of the MATLAB function to compile. The \r\n% generated executable takes its name from the name of the first \r\n% MATLAB function specified on the command line.\r\n% * |-a topo.mat|: |-a| stands for ''additional file''; it is typically\r\n% used to add data files to the application.\r\n%\r\n% This |mcc| command will create a standalone executable called |helloworld|\r\n% on UNIX systems, |helloworld.exe| on PCs running Microsoft Windows. \r\n%\r\n% In order to run the executable, the operating system needs to be able to\r\n% find the MCR. You need to put the MCR's |runtime\/<architecture>|\r\n% directory on the system's \r\n% <https:\/\/www.mathworks.com\/help\/releases\/R2010b\/toolbox\/compiler\/f12-999353.html#br2jauc-33 \r\n% library search path>. On Windows, you add it to\r\n% the |PATH| environment variable. On Unix, you add it to |LD_LIBRARY_PATH|\r\n% (except on the MacIntosh, which uses |DYLD_LIBRARY_PATH|). To run the\r\n% executable locally (on the machine where you created it), use MATLAB's\r\n% |runtime\/<architecture>| directory. If the environment variable\r\n% |MATLAB_ROOT| indicates the root of your MATLAB installation, add the\r\n% |runtime| directory to the library search path with one of the following\r\n% commands\r\n\r\n\r\n%%\r\n% \r\n%  Linux 32-bit:\r\n%    % setenv LD_LIBRARY_PATH $MATLAB_ROOT\/runtime\/glnx86\r\n%    \r\n%  Windows:\r\n%    c:\\Work> set %PATH%;%MATLAB_ROOT%\\runtime\\win32\r\n%\r\n% Then, run the application:\r\n%\r\n%  UNIX:\r\n%    % helloworld\r\n%\r\n%  Windows:\r\n%    c:\\Work> helloworld.exe\r\n\r\n%%\r\n% You should see a single window displaying a map of the world.\r\n    \r\n%% How Can I Help?\r\n% Writing applications for deployment requires a new set of skills. There\r\n% are differences between the MATLAB interactive environment and the DOS\r\n% and Unix command lines that I can't (and don't want to) erase. But I do\r\n% want to make the deployment process as painless as possible. Let me know\r\n% how we're doing. Tell me what we've done right, and how we could improve.\r\n% I've got a long list of topics lined up for future postings, but I'm very\r\n% interested in hearing what you'd like to know.\r\n% <https:\/\/blogs.mathworks.com\/loren\/?p=255#respond Reply> to this posting\r\n% and let's get started.\r\n\r\n\r\n##### SOURCE END ##### 43ee8f747f2b437382f6f4aec220a80b\r\n-->","protected":false},"excerpt":{"rendered":"<p>\r\n   \r\n      Guest blogger Peter Webb returns with another in an occasional series of postings about application deployment.\r\n      \r\n   \r\n   Contents\r\n   \r\n      \r\n   ... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/loren\/2010\/11\/18\/deploying-standalone-applications\/\">read more >><\/a><\/p>","protected":false},"author":39,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[24],"tags":[],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/posts\/255"}],"collection":[{"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/users\/39"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/comments?post=255"}],"version-history":[{"count":2,"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/posts\/255\/revisions"}],"predecessor-version":[{"id":2397,"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/posts\/255\/revisions\/2397"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/media?parent=255"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/categories?post=255"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/tags?post=255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}