{"id":289,"date":"2015-12-18T00:03:14","date_gmt":"2015-12-18T00:03:14","guid":{"rendered":"https:\/\/blogs.mathworks.com\/developer\/?p=289"},"modified":"2015-12-18T00:03:14","modified_gmt":"2015-12-18T00:03:14","slug":"open-and-extensible","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/developer\/2015\/12\/18\/open-and-extensible\/","title":{"rendered":"Open and extensible"},"content":{"rendered":"<div class=\"content\"><!--introduction--><p>MATLAB is an open and extensible platform unique in its ability to dovetail with best-in-class technologies. <i>Open<\/i>, refers to the fact that much of MATLAB functionality is shipped in MATLAB files whose source can be studied. The community driven contributions on <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/\">File Exchange<\/a> has grown over the years to a scale that rivals the code that ships on the DVD. <i>Extensible<\/i>, refers to MATLAB's ability to integrate with other languages and technology stacks.<\/p><p>MATLAB's extensibility provides access to a wide variety of functionality in C\/C++, Java, .NET, Perl, Python, etc. Some 3rd party libraries such as Xerces&trade; (for processing XML) are baked into the shipping MATLAB product itself.<\/p><p>MATLAB is designed to be extensible, for example, the MEX interface provides  access to nearly all of FORTRAN and C\/C++ functionality for the expression of numeric algorithms.<\/p><p><b>Leveraging the extensibility of MATLAB - the Triple-word-score<\/b><\/p><p>How does MATLAB's extensibility help you in your day-to-day life?<\/p><p>An immediate problem and answer to this question presented itself in the authoring of content for this very blog. You may have noticed the \"published in MATLAB\" at the very bottom of this blog post.<\/p><p>Bloggers on this site often use MATLAB for authoring their content and I am no exception. A <a href=\"http:\/\/sd.keepcalm-o-matic.co.uk\/i\/keep-clam-and-use-spellcheck-2.png\" target=\"_blank\">spellchecker<\/a> is always helpful when writing. Since I use the MATLAB editor, there is an immediate need to simplify my workflow by providing easy access to spellcheck from the MATLAB environment itself.<\/p><p>A spellchecker could benefit other users so I quickly drew up a list of requirements. A MATLAB spellchecker needed to be:<\/p><div><ul><li>lightweight and free (i.e. be accessible across most versions of MATLAB)<\/li><li>cross-platform (i.e. work with our Windows, Mac and Linux releases)<\/li><li>multi-lingual (i.e. make no assumptions around use of English as we have over a million users worldwide)<\/li><li>customizable (i.e. allow for the modification of word lists)<\/li><li>easy-to-build-and-use (i.e. not turn into a huge project in itself)<\/li><\/ul><\/div><p>The first step was to ensure that I was not re-inventing the wheel. A quick <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/\">File Exchange<\/a> search and follow-up internet searches turned up nothing.<\/p><p>Not finding what I needed, I decided to build a spellchecker by leveraging existing technology with a little MATLAB effort. I call extending MATLAB functionality a \"triple-word-score\" since it nets large increments in productivity with minimal effort.<\/p><p><b>Putting it together by NOT re-inventing the wheel<\/b><\/p><p>Given the cross-platform requirement, I quickly eliminated the .NET options and settled for a Java library with a clean API. Jazzy had an aging codebase but a clean API and a full set of language dictionaries which fit my requirements well. It allowed me to put a check against the <i>cross-platform<\/i> and <i>lightweight and free<\/i> requirements.<\/p><p>The Jazzy API lends itself to integration through a simple wrapper in Java which allows for a cleaner calling interface. To build our Java class (SpellCheck.java), I fired up a Java IDE and imported the <a href=\"http:\/\/sourceforge.net\/projects\/jazzy\/\">Jazzy libraries from Sourceforge<\/a>:<\/p><!--\/introduction-->\r\n<pre class=\"codeinput\">\r\n<span class=\"comment\">\/* Package Specification*\/<\/span>\r\npackage com.mathworks.spellcheck;\r\n\r\n<span class=\"comment\">\/* Jazzy Imports *\/<\/span>\r\nimport com.swabunga.spell.engine.SpellDictionary;\r\nimport com.swabunga.spell.engine.SpellDictionaryHashMap;\r\nimport com.swabunga.spell.event.SpellCheckEvent;\r\nimport com.swabunga.spell.event.SpellCheckListener;\r\nimport com.swabunga.spell.event.SpellChecker;\r\nimport com.swabunga.spell.event.StringWordTokenizer;\r\n\r\n<span class=\"comment\">\/* Java Imports *\/<\/span>\r\nimport java.io.File;\r\nimport java.util.Iterator;\r\nimport java.util.List;\r\n<\/pre>\r\n\r\n<p>Building a simple java class that implements a listener for our events.<\/p>\r\n\r\n<pre class=\"codeinput\">\r\n<span class=\"comment\">\/**<\/span>\r\n<span class=\"comment\"> * This class provides a MATLAB callback to check the spelling of the comments<\/span>\r\n<span class=\"comment\"> * in the code.<\/span>\r\n<span class=\"comment\"> *\/<\/span>\r\npublic class SpellCheck implements SpellCheckListener {\r\n\r\n    private SpellChecker spellCheck; \r\n    \r\n    <span class=\"comment\">\/* Method that sets the dictionary *\/ <\/span>\r\n    public void setDictionary(String dictFile) {\r\n        try {\r\n            SpellDictionary dictionary = new SpellDictionaryHashMap(new File(dictFile));\r\n            spellCheck = new SpellChecker(dictionary);\r\n            spellCheck.addSpellCheckListener(this);\r\n        } catch (Exception e) {\r\n            e.printStackTrace();\r\n        }\r\n    } \r\n    \r\n    <span class=\"comment\">\/* Method to check the spelling *\/<\/span> \r\n    public void checkSpelling(String inputText) {\r\n        try {\r\n            spellCheck.checkSpelling(new StringWordTokenizer(inputText));\r\n        } catch (Exception e) {\r\n            e.printStackTrace();\r\n        }\r\n        \r\n    } \r\n    \r\n    <span class=\"comment\">\/* Event listener goes here *\/<\/span>\r\n} \r\n<\/pre>\r\n\r\n<p>We have a method to set a language specific dictionary and a method to check the spelling of an input String. The Jazzy library will then fire an event that we act on. The event listener looks like this:<\/p>\r\n\r\n<pre class=\"codeinput\">\r\n   <span class=\"comment\">\/* Event listener that populates the suggestions and echo them as necessary *\/<\/span>\r\n    public void spellingError(SpellCheckEvent event) {\r\n        String message = new String(\"MISSPELT WORD: \" + event.getInvalidWord()); \r\n        \r\n        <span class=\"comment\">\/* Echo to the command prompt *\/<\/span> \r\n        List suggestions = event.getSuggestions();\r\n        System.out.println(message);\r\n        \r\n        if (suggestions.size() > 0) {\r\n            for (Iterator suggestedWord = suggestions.iterator(); suggestedWord.hasNext();) {\r\n                System.out.println(\"\\tSuggested Word: \" + suggestedWord.next());\r\n            }\r\n        } else {\r\n            System.out.println(\"\\tNo suggestions\");\r\n        }\r\n    }\r\n<\/pre>\r\n\r\n<p>The first version of this Java module just echoes the spelling error and suggestions to the Command Window. Compiling the java code and packaging it into a JAR file is usually a single click operation in most Java development tools.<\/p>\r\n\r\n<pre>\r\ncompile:\r\nBuilding jar: I:\\Work\\SpellChecker\\lib\\java\\MATLABSpellCheck\\dist\\MATLABSpellCheck.jar\r\njar:\r\nBUILD SUCCESSFUL (total time: 1 second)<\/pre><p>MATLAB is built on a Java platform so enabling this module was a single line of code to add it to the dynamic java classpath. I had my basic spellcheck in MATLAB in minutes.<\/p><pre class=\"codeinput\">javaaddpath(<span class=\"string\">'I:\\Work\\SpellChecker\\lib\\java\\MATLABSpellCheck\\dist\\MATLABSpellCheck.jar'<\/span>);\r\n<\/pre>\r\n\r\n<p><b>Testing it out<\/b><\/p><p>To test it out, I downloaded a few sample dictionaries from the <a href=\"http:\/\/sourceforge.net\/projects\/jazzydicts\/\">JazzyDicts SourceForge repository<\/a> which contains a wide selection of supported languages. Then, in MATLAB: <\/p>\r\n\r\n<pre class=\"codeinput\"><span class=\"comment\">% Make Jazzy available to MATLAB<\/span>\r\nimport <span class=\"string\">com.mathworks.spellcheck.*<\/span>;\r\n\r\n<span class=\"comment\">% Setup a default language.<\/span>\r\ndictFile = which(<span class=\"string\">'en_USx.dic'<\/span>);\r\n\r\n<span class=\"comment\">% Create a jazzy spellchecker<\/span>\r\nobj = SpellCheck();\r\nobj.setDictionary(dictFile);\r\n\r\n<span class=\"comment\">% Check the spelling of an input string<\/span>\r\nobj.checkSpelling(<span class=\"string\">'Yello Worrld'<\/span>)\r\n<\/pre><pre class=\"codeoutput\">MISSPELT WORD: Yello\r\n\tSuggested Word: Jello\r\n\tSuggested Word: Cello\r\n\tSuggested Word: cello\r\n\tSuggested Word: hello\r\nMISSPELT WORD: Worrld\r\n\tSuggested Word: world\r\n<\/pre>\r\n\r\n<p>It only takes a few more lines of code to wrap this as an easy-to-use MATLAB class that inspects the contents of my editor.<\/p>\r\n\r\n<p>With that I was able to check-off the requirements for being <i>multi-lingual<\/i> and <i>easy-to-use<\/i>. I added common words like MATLAB, etc. to my local dictionary file and continue improving it as I go.<\/p><p>The module itself is less important than the technique that shows one way to extend the MATLAB platform. I decided to keep this post a single, simple example to describe MATLAB's ability to leverage other technologies out there. We plan to talk about how to produce an user-friendly MATLAB interface in the upcoming posts.<\/p>\r\n\r\n<p>In summary, MATLAB's functionality can be complemented and strengthened with 3rd party technologies to provide a single cohesive user experience.<\/p><p>MATLAB can also bring powerful functionality into other platforms, but that is a whole other topic.<\/p><script language=\"JavaScript\"> <!-- \r\n    function grabCode_76c019bdae834ed2aec42983706b8d49() {\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='76c019bdae834ed2aec42983706b8d49 ' + '##### ' + 'SOURCE BEGIN' + ' #####';\r\n        t2='##### ' + 'SOURCE END' + ' #####' + ' 76c019bdae834ed2aec42983706b8d49';\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 2015 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_76c019bdae834ed2aec42983706b8d49()\"><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; R2015b<br><\/p><\/div><!--\r\n76c019bdae834ed2aec42983706b8d49 ##### SOURCE BEGIN #####\r\n%%\r\n% MATLAB is an open and extensible platform unique in its ability\r\n% to dovetail with best-in-class technologies. _Open_, refers to the fact\r\n% that much of MATLAB functionality is shipped in MATLAB files whose source \r\n% can be studied. The community driven contributions on \r\n% <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/ File Exchange> has \r\n% grown over the years to a scale that rivals the code that ships on the DVD. \r\n% _Extensible_, refers to MATLAB's ability to integrate with \r\n% other languages and technology stacks. \r\n% \r\n% MATLAB's extensibility provides access to a wide variety of \r\n% functionality in C\/C++, Java, .NET, Perl, Python, etc. Some 3rd party \r\n% libraries such as Xerces (for processing XML) are baked into the shipping \r\n% MATLAB product itself. \r\n% \r\n% MATLAB is designed to be extensible, for example, the MEX interface \r\n% provides  access to nearly all of FORTRAN and C\/C++ functionality for the \r\n% expression of numeric algorithms. \r\n% \r\n% *Leveraging extensibility - the Triple-word-score*\r\n% \r\n% How does MATLAB's extensibility help you in your day-to-day life? \r\n% \r\n% An immediate problem and answer to this question presented itself in the \r\n% authoring of content for this very blog. You may have noticed the \"published \r\n% in MATLAB\" at the very bottom of this blog post.\r\n% \r\n% Bloggers on this site, often use MATLAB for authoring their content and I\r\n% am no exception. A spellchecker is always helpful when writing. \r\n% Since I use the MATLAB editor, there is an immediate need to\r\n% simplify my workflow by providing easy access to spellcheck from the \r\n% MATLAB environment itself.\r\n% \r\n% A spellchecker could benefit other users so I quickly drew up a list of\r\n% requirements. A MATLAB spellchecker needed to be:\r\n% \r\n% * lightweight and free (i.e. be accessible across most versions of MATLAB)\r\n% * cross-platform (i.e. work with our Windows, Mac and Linux releases)\r\n% * multi-lingual (i.e. make no assumptions around use of English as we have over a million users worldwide)\r\n% * customizable (i.e. allow for the modification of word lists)\r\n% * easy-to-build-and-use (i.e. not turn into a huge project in itself)\r\n% \r\n% The first step was to ensure that I was not re-inventing the wheel. A quick\r\n% <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/ File Exchange> search \r\n% and follow-up internet searches turned up nothing.\r\n% \r\n% Not finding what I needed, I decided to build a spellchecker by leveraging \r\n% existing technology with a little MATLAB effort. I call extending MATLAB functionality \r\n% a \"triple-word-score\" since it nets large increments in productivity with minimal effort. \r\n%  \r\n% *Putting it together by NOT re-inventing the wheel* \r\n% \r\n% Given the cross-platform requirement, I quickly eliminated the \r\n% .NET options and settled for a Java library with a clean API. Jazzy had an\r\n% aging codebase but a clean API and a full set of language dictionaries \r\n% which fit my requirements well. It allowed me to put a check against the\r\n% _cross-platform_ and _lightweight and free_ requirements. \r\n% \r\n% The Jazzy API lends itself to integration through a simple wrapper in Java which allows for a cleaner \r\n% calling interface. To build our Java class (SpellCheck.java), I fired up \r\n% a Java IDE and imported the <http:\/\/sourceforge.net\/projects\/jazzy\/ Jazzy libraries from Sourceforge>:\r\n% \r\n%%  \r\n%   \r\n%  \/* Package Specification*\/\r\n%  package com.mathworks.spellcheck;\r\n% \r\n%  \/* Jazzy Imports *\/\r\n%  import com.swabunga.spell.engine.SpellDictionary;\r\n%  import com.swabunga.spell.engine.SpellDictionaryHashMap;\r\n%  import com.swabunga.spell.event.SpellCheckEvent;\r\n%  import com.swabunga.spell.event.SpellCheckListener;\r\n%  import com.swabunga.spell.event.SpellChecker;\r\n%  import com.swabunga.spell.event.StringWordTokenizer;\r\n% \r\n%  \/* Java Imports *\/\r\n%  import java.io.File;\r\n%  import java.util.Iterator;\r\n%  import java.util.List;\r\n% \r\n% Building a simple java class that implements a listener for our events.\r\n% \r\n%  \/**\r\n%   * This class provides a MATLAB callback to check the spelling of the comments\r\n%   * in the code.\r\n%   *\/\r\n%  public class SpellCheck implements SpellCheckListener {\r\n%  \r\n%      private SpellChecker spellCheck = null;\r\n%      public String candidate;\r\n%      public List suggestions;\r\n%      public boolean verbose;\r\n%      public String linenumber;\r\n%  \r\n%      \/* Constructor *\/\r\n%      public SpellCheck() {\r\n%      }\r\n%      \r\n%      \/* Method that sets the dictionary *\/\r\n%      public void setDictionary(String dictFile) {\r\n%          try {\r\n%              SpellDictionary dictionary = new SpellDictionaryHashMap(new File(dictFile));\r\n%  \r\n%              spellCheck = new SpellChecker(dictionary);\r\n%              spellCheck.addSpellCheckListener(this);\r\n%  \r\n%          } catch (Exception e) {\r\n%              e.printStackTrace();\r\n%          }\r\n%      }\r\n%  \r\n%      \/* Method to check the spelling *\/\r\n%      public void checkSpelling(String inputText) {\r\n%          try {\r\n%              spellCheck.checkSpelling(new StringWordTokenizer(inputText));\r\n%          } catch (Exception e) {\r\n%              e.printStackTrace();\r\n%          }\r\n%  \r\n%      \/* Event listener goes here *\/\r\n%  }\r\n%  \r\n% The constructor for our spellchecker is accompanied by a method to set a\r\n% language specific dictionary and a method to check the spelling of an \r\n% input String. The Jazzy library will then fire an event that we \r\n% act on. The event listener looks like this:\r\n% \r\n%     \/* Event listener that populates the suggestions and echo them as necessary *\/\r\n%     public void spellingError(SpellCheckEvent event) {\r\n%         \/* Store suggestions *\/\r\n%         this.candidate = event.getInvalidWord();\r\n%         this.suggestions = event.getSuggestions();\r\n%         \r\n%         String message = new String(\"MISSPELT WORD: Line \" + \r\n%                 \"<a href=\\\"matlab:matlab.desktop.editor.openAndGoToLine(matlab.desktop.editor.getActiveFilename,\" + \r\n%                 this.linenumber + \r\n%                 \");\\\">\"+ this.linenumber +\r\n%                 \"<\/a> - \" + this.candidate);\r\n%                 \r\n%         if (suggestions.size() > 0) {\r\n%             \r\n%             \/* Echo to the command prompt *\/\r\n%             if (this.verbose){\r\n%                 System.out.println(message);\r\n%                 for (Iterator suggestedWord = suggestions.iterator(); suggestedWord.hasNext();) {\r\n%                     System.out.println(\"\\tSuggested Word: \" + suggestedWord.next());\r\n%                 }\r\n%             }\r\n%         } else {\r\n%             \/* Echo to the command prompt *\/\r\n%             if (this.verbose) {\r\n%                 System.out.println(message);\r\n%                 System.out.println(\"\\tNo suggestions\");\r\n%             }\r\n%         }\r\n%     }\r\n%\r\n% The first version of this Java module just echoes the spelling error and\r\n% suggestions to the Command Window. Compiling the java code and packaging it into a JAR file is \r\n% usually a single click operation in most Java development tools.\r\n% \r\n%  compile:\r\n%  Building jar: I:\\Work\\SpellChecker\\lib\\java\\MATLABSpellCheck\\dist\\MATLABSpellCheck.jar\r\n%  jar:\r\n%  BUILD SUCCESSFUL (total time: 1 second)\r\n% \r\n% MATLAB is built on a Java platform so enabling this module was\r\n% a single line of code to add it to the dynamic java classpath. I\r\n% had my basic spellcheck in MATLAB in minutes.\r\n% \r\njavaaddpath('I:\\Work\\SpellChecker\\lib\\java\\MATLABSpellCheck\\dist\\MATLABSpellCheck.jar');\r\n\r\n%%\r\n% *Testing it out*\r\n% \r\n% To test it out, I downloaded a few sample dictionaries from the \r\n% <http:\/\/sourceforge.net\/projects\/jazzydicts\/ JazzyDicts SourceForge repository> which \r\n% contains a wide selection of supported languages. \r\n\r\n% Make Jazzy available to MATLAB\r\nimport com.mathworks.spellcheck.*;\r\n\r\n% Setup a default language.\r\ndictFile = which('en_USx.dic'); \r\n\r\n% Create a jazzy spellchecker\r\nobj = SpellCheck();\r\nobj.setDictionary(dictFile);\r\n\r\n% Check the spelling of an input string\r\nobj.checkSpelling('yello worrld')\r\n\r\n%  MISSPELT WORD: Yello\r\n%  \tSuggested Word: Jello\r\n%  \tSuggested Word: Cello\r\n%  \tSuggested Word: cello\r\n%  \tSuggested Word: hello\r\n%  MISSPELT WORD: Worrld\r\n%  \tSuggested Word: world\r\n\r\n%%\r\n%\r\n% It took a few more lines of code to wrap this\r\n% as an easy-to-use MATLAB class that inspects the contents of my editor.\r\n% With that I was able to check-off the requirements for being\r\n% _multi-lingual_ and _easy-to-use_. I added common words like MATLAB, etc. to my\r\n% local dictionary file and continue improving it as I go. \r\n% \r\n% The module itself is less important than the technique that shows one way\r\n% to extend the MATLAB platform. My colleagues who saw this immediately pointed out \r\n% a whole list of enhancements such as auto-correct. I decided to keep this post \r\n% a single, simple example to describe MATLAB's ability to leverage other technologies out there.\r\n% \r\n% In summary, MATLAB's functionality can be complemented and strengthened \r\n% with 3rd party technologies to provide a single cohesive user experience.\r\n% \r\n% MATLAB can bring powerful functionality into other platforms, but that is a whole other topic.\r\n\r\n\r\n##### SOURCE END ##### 76c019bdae834ed2aec42983706b8d49\r\n-->","protected":false},"excerpt":{"rendered":"<div class=\"overview-image\"><img src=\"https:\/\/blogs.mathworks.com\/developer\/files\/keep-clam-and-use-spellcheck-2.png\" class=\"img-responsive attachment-post-thumbnail size-post-thumbnail wp-post-image\" alt=\"Keep clam and use spellcheck\" decoding=\"async\" loading=\"lazy\" \/><\/div><!--introduction--><p>MATLAB is an open and extensible platform unique in its ability to dovetail with best-in-class technologies. <i>Open<\/i>, refers to the fact that much of MATLAB functionality is shipped in MATLAB files whose source can be studied. The community driven contributions on <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/\">File Exchange<\/a> has grown over the years to a scale that rivals the code that ships on the DVD. <i>Extensible<\/i>, refers to MATLAB's ability to integrate with other languages and technology stacks.... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/developer\/2015\/12\/18\/open-and-extensible\/\">read more >><\/a><\/p>","protected":false},"author":135,"featured_media":373,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[10],"tags":[],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/posts\/289"}],"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\/135"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/comments?post=289"}],"version-history":[{"count":32,"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/posts\/289\/revisions"}],"predecessor-version":[{"id":382,"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/posts\/289\/revisions\/382"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/media\/373"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/media?parent=289"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/categories?post=289"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/developer\/wp-json\/wp\/v2\/tags?post=289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}