{"id":6398,"date":"2013-07-17T20:57:06","date_gmt":"2013-07-17T18:57:06","guid":{"rendered":"http:\/\/code.openark.org\/blog\/?p=6398"},"modified":"2013-07-17T20:57:06","modified_gmt":"2013-07-17T18:57:06","slug":"common_schema-2-1-released-advanced-improved-split-persistent-script-tables-more-schema-analysis-and-ahem-charts","status":"publish","type":"post","link":"https:\/\/code.openark.org\/blog\/mysql\/common_schema-2-1-released-advanced-improved-split-persistent-script-tables-more-schema-analysis-and-ahem-charts","title":{"rendered":"common_schema 2.1 released: advanced &#038; improved split(), persistent script tables, more schema analysis, and (ahem) charts!"},"content":{"rendered":"<p><a href=\"https:\/\/code.google.com\/p\/common-schema\/\"><strong>common_schema 2.1<\/strong><\/a> is released! <em>common_schema<\/em> is your free &amp; open source companion schema within your MySQL server, providing with a function library, scripting capabilities, powerful routines and ready-to-apply information and recommendations.<\/p>\n<p>New and noteworthy in version <strong>2.1<\/strong>:<\/p>\n<ul>\n<li>Better <em>QueryScript&#8217;<\/em>s <a href=\"http:\/\/common-schema.googlecode.com\/svn\/trunk\/common_schema\/doc\/html\/query_script_split.html\"><strong>split()<\/strong><\/a> functionality<\/li>\n<li>Persistent tables for QueryScript: no long held temporary tables<\/li>\n<li>Index creation analysis, further range partition analysis<\/li>\n<li><a href=\"http:\/\/common-schema.googlecode.com\/svn\/trunk\/common_schema\/doc\/html\/grant_access.html\"><strong>grant_access()<\/strong><\/a>: allow everyone to use <em>common_schema<\/em><\/li>\n<li>Ascii charts, google charts<\/li>\n<li><strong>debugged_routines<\/strong>: show routines with debug code<\/li>\n<\/ul>\n<p>Other minor enhancements and bugfixes not listed.<\/p>\n<p>Here&#8217;s a breakdown of the above:<\/p>\n<h4>split() enhancements<\/h4>\n<p><strong><a href=\"http:\/\/common-schema.googlecode.com\/svn\/trunk\/common_schema\/doc\/html\/query_script_split.html\">split<\/a><\/strong> is one of those parts of <em>common_schema<\/em> that (should) appeal to every DBA. Break a huge transaction automagically into smaller chunks, and don&#8217;t worry about how it&#8217;s done. If you like, throttle execution, or print progress, or&#8230;<\/p>\n<p><em>split<\/em> enhancements include:<\/p>\n<ul>\n<li>A much better auto-detection-and-selection of the chunking index. <em>split<\/em> now consults all columns covered by the index, and uses realistic heuristics to decide which <strong>UNIQUE KEY<\/strong> on your table is best for the chunking process. A couple bugs are solved on the way; <em>split<\/em> is much smarter now.<\/li>\n<li>Better support for multi-column chunking keys. You may now utilize the <a href=\"http:\/\/common-schema.googlecode.com\/svn\/trunk\/common_schema\/doc\/html\/query_script_split.html#parameters\"><strong>start<\/strong>\/<strong>stop<\/strong> parameters<\/a> even on multi column keys, passing a comma delimited of values for the <em>split<\/em> operation to start\/end with, respectively. Also fixed issue for nonexistent <strong>start\/stop<\/strong> values, which are now valid: <em>split<\/em> will just keep to the given range.<\/li>\n<li>split no longer requires a temporary table open through the duration of its operation. See next section.<!--more--><\/li>\n<\/ul>\n<h4>Persistent script tables<\/h4>\n<p>QueryScript used to use several temporary tables for its operation. Thus, a script could hold open two or three temporary tables for the entire execution duration. For long <em>split<\/em> operations, for example, this could mean hours and days.<\/p>\n<p>Temporary tables are nice and quick to respond (well, MyISAM tables are, until MySQL <strong>5.7<\/strong> is out), but make for an inherent problem: stopped slaves must not shut down nor restart when replication has an open temporary table. Why? Well, because the slave forgets about the temporary tables. When it resumes operation, it will not recognize DML issued against those tables it has forgotten. That&#8217;s why <a href=\"http:\/\/openarkkit.googlecode.com\/svn\/trunk\/openarkkit\/doc\/html\/oak-prepare-shutdown.html\">oak-prepare-shutdown<\/a> is so good for slaves.<\/p>\n<p>When temporary tables are short-lived, this is typically not an issue. But if you are not allowed to restart your slave throughout a 24 hour operation, that&#8217;s a limitation.<\/p>\n<p>As of <strong>2.1<\/strong>, QueryScript does not require long held temporary tables. In fact, typical scripts do not create <em>any<\/em> temporary tables. A <em>split<\/em> operation creates and immediately drops a series of temporary tables. These are dropped even before actual <em>split<\/em> operation begins. All tables operated on are persistent <strong>InnoDB<\/strong> tables.<\/p>\n<p><em>Result<\/em>: safer script replication. There&#8217;s another nice side effect I may take advantage of in a later release: ability to monitor and control flow of concurrent scripts.<\/p>\n<h4>Schema analysis<\/h4>\n<p>Two noteworthy additions to schema analysis views:<\/p>\n<ul>\n<li><a href=\"http:\/\/common-schema.googlecode.com\/svn\/trunk\/common_schema\/doc\/html\/sql_alter_table.html\"><strong>sql_alter_table<\/strong><\/a> now includes the <strong>sql_drop_keys<\/strong> &amp; <strong>sql_add_keys<\/strong> columns. For each table, you get the SQL statements to create and drop the existing indexes. I developed this when I hit <a href=\"https:\/\/groups.google.com\/d\/msg\/tokudb-user\/hLlHwlp2AL0\/nvNlUCzhxAwJ\">this problem<\/a> with TokuDB.<\/li>\n<li><a href=\"http:\/\/common-schema.googlecode.com\/svn\/trunk\/common_schema\/doc\/html\/sql_range_partitions.html\"><strong>sql_range_partitions<\/strong><\/a> now includes the <strong>count_past_partitions<\/strong> &amp; <strong>count_future_partitions<\/strong>; when your table is partitioned by some type of time range, these views tell you how many partitions are in the past, and how many are to be written to in the future. This turns useful when you want to rotate or otherwise set a retention policy for your range partitions.<\/li>\n<\/ul>\n<h4>grant_access()<\/h4>\n<p>The <a href=\"http:\/\/common-schema.googlecode.com\/svn\/trunk\/common_schema\/doc\/html\/grant_access.html\"><strong>grant_access()<\/strong><\/a> routine <strong>GRANT<\/strong>s all accounts on your server with <strong>SELECT<\/strong> &amp; <strong>EXECUTE<\/strong> privileges on <em>common_schema<\/em>. This is a quick complementary to the installation process (though you have to invoke it yourself; it&#8217;s up to you).<\/p>\n<h4>Ascii\/google line charts<\/h4>\n<p>Laugh all you want! And find how cool it is to get (poor man&#8217;s) instant charting like this:<\/p>\n<blockquote>\n<pre>mysql&gt; call <strong>line_chart<\/strong>('select ts, com_insert_psec, com_update_psec from mycheckpoint.sv_hour limit 100', 'insert per second, update per second') ;\r\n+---------+------------------------------------------------------------------------------------------------------+\r\n| y_scale | chart\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n+---------+------------------------------------------------------------------------------------------------------+\r\n| 162\u00a0\u00a0\u00a0\u00a0 | -#-------------------------------------------------------------------------------------------------- |\r\n| 152\u00a0\u00a0\u00a0\u00a0 | ---------------------------------------------------------------------------------------------------- |\r\n| 143\u00a0\u00a0\u00a0\u00a0 | ---------------------------------------------------------------------------------------------------- |\r\n| 134\u00a0\u00a0\u00a0\u00a0 | ---------------------------------------------------------------------------------------------------- |\r\n| 124\u00a0\u00a0\u00a0\u00a0 | ---------------------------------------------------------------------------------------------------- |\r\n| 115\u00a0\u00a0\u00a0\u00a0 | ------------------------------------------------------------#--------------------------------------- |\r\n| 106\u00a0\u00a0\u00a0\u00a0 | ---------------------------------------------------------------------------------------------------- |\r\n| 96\u00a0\u00a0\u00a0\u00a0\u00a0 | -*-------------------------------------------------------------------------------------------------- |\r\n| 87\u00a0\u00a0\u00a0\u00a0\u00a0 | ---------------------------------#-------------------------#---------------------------------------- |\r\n| 77\u00a0\u00a0\u00a0\u00a0\u00a0 | ---------------------------------------------------------------------------------#------------------ |\r\n| 68\u00a0\u00a0\u00a0\u00a0\u00a0 | ---------------------------------------------------------------------------#------------------------ |\r\n| 59\u00a0\u00a0\u00a0\u00a0\u00a0 | #-------------------------------#------------------------------------------------------------------- |\r\n| 49\u00a0\u00a0\u00a0\u00a0\u00a0 | ---##------#-#-##-#-#--#--###----------------##---------------------------------#-----#---###------- |\r\n| 40\u00a0\u00a0\u00a0\u00a0\u00a0 | --#------#--#-#--#-#-##-##----##--###########--######--------#############-*#-##--####-###---####### |\r\n| 31\u00a0\u00a0\u00a0\u00a0\u00a0 | *-**--#-#-*-**-**------**--**#-****-**-*****-*******-#---#-*------------**---#--*------------------- |\r\n| 21\u00a0\u00a0\u00a0\u00a0\u00a0 | ----*#*#*--*--*--******--**--**----*--*-----*-------**#*#**-************--#-****-******************* |\r\n| 12\u00a0\u00a0\u00a0\u00a0\u00a0 | -----*-*-*--------------------------------------------*-*-----------------*------------------------- |\r\n|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | v::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::v |\r\n|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | 2010-10-06 20:00:00\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2010-10-10 23:00:00 |\r\n|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0 # insert per second\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0 * update per second\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n+---------+------------------------------------------------------------------------------------------------------+<\/pre>\n<\/blockquote>\n<p>You can get the same in <a href=\"https:\/\/developers.google.com\/chart\/image\/\">Google Image Charts<\/a> format. Yes, it&#8217;s deprecated (and has been for a year &#8212; it&#8217;s still working)<\/p>\n<blockquote>\n<pre>mysql&gt; call <strong>google_line_chart<\/strong>('select ts, com_insert_psec, com_update_psec from mycheckpoint.sv_hour limit 100', 'insert per second, update per second') \\G\r\n\r\ngoogle_chart_url: <a href=\"http:\/\/chart.apis.google.com\/chart?cht=lc&amp;chs=800x350&amp;chtt=SQL+chart+by+common_schema&amp;chxt=x,y&amp;chxr=1,11.9,161.7&amp;chd=s:S9NOOGKFGKHQMONPONONNKNONNOOQINMRgLLNMMNNNNNNOONMNNNMHEFFJFfsLLMMMLLMNMMNNDVNIMKPaKLLMOMNNNONNNMMMMM,IiGGFCDBCBGFGGGGGFGGFEFGGGGGHDGGJGGGGGFGGGGGGGGGGGGGFCBCCCEHGGGFFFFFGGGFGGAKFDFFIFFFFFFFFFFFFFFFFFFF&amp;chxs=0,505050,10,0,lt&amp;chxl=0:|2010-10-06%2020:00:00||||||||||||||||||||||||2010-10-07%2020:00:00|||||||||||||||||||||||||2010-10-08%2021:00:00|||||||||||||||||||||||||2010-10-09%2022:00:00|||||||||||||||||||||||||2010-10-10%2023:00:00&amp;chg=1.010101010,25,1,2,0,0&amp;chco=ff8c00,4682b4&amp;chdl=insert%20per%20second|update%20per%20second&amp;chdlp=b\">http:\/\/chart.apis.google.com\/chart?cht=lc&amp;chs=800x350&amp;chtt=SQL+chart+by+common_schema&amp;chxt=x,y&amp;chxr=1,11.9,161.7&amp;chd=s:S9NOOGKFGKHQMONPONONNKNONNOOQINMRgLLNMMNNNNNNOONMNNNMHEFFJFfsLLMMMLLMNMMNNDVNIMKPaKLLMOMNNNONNNMMMMM,IiGGFCDBCBGFGGGGGFGGFEFGGGGGHDGGJGGGGGFGGGGGGGGGGGGGFCBCCCEHGGGFFFFFGGGFGGAKFDFFIFFFFFFFFFFFFFFFFFFF&amp;chxs=0,505050,10,0,lt&amp;chxl=0:|2010-10-06%2020:00:00||||||||||||||||||||||||2010-10-07%2020:00:00|||||||||||||||||||||||||2010-10-08%2021:00:00|||||||||||||||||||||||||2010-10-09%2022:00:00|||||||||||||||||||||||||2010-10-10%2023:00:00&amp;chg=1.010101010,25,1,2,0,0&amp;chco=ff8c00,4682b4&amp;chdl=insert%20per%20second|update%20per%20second&amp;chdlp=b<\/a><\/pre>\n<\/blockquote>\n<p>The above translates into the following image:<\/p>\n<blockquote><p><a href=\"http:\/\/chart.apis.google.com\/chart?cht=lc&amp;chs=800x350&amp;chtt=SQL+chart+by+common_schema&amp;chxt=x,y&amp;chxr=1,11.9,161.7&amp;chd=s:S9NOOGKFGKHQMONPONONNKNONNOOQINMRgLLNMMNNNNNNOONMNNNMHEFFJFfsLLMMMLLMNMMNNDVNIMKPaKLLMOMNNNONNNMMMMM,IiGGFCDBCBGFGGGGGFGGFEFGGGGGHDGGJGGGGGFGGGGGGGGGGGGGFCBCCCEHGGGFFFFFGGGFGGAKFDFFIFFFFFFFFFFFFFFFFFFF&amp;chxs=0,505050,10,0,lt&amp;chxl=0:|2010-10-06 20:00:00||||||||||||||||||||||||2010-10-07 20:00:00|||||||||||||||||||||||||2010-10-08 21:00:00|||||||||||||||||||||||||2010-10-09 22:00:00|||||||||||||||||||||||||2010-10-10 23:00:00&amp;chg=1.010101010,25,1,2,0,0&amp;chco=ff8c00,4682b4&amp;chdl=insert per second|update per second&amp;chdlp=b\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" alt=\"\" src=\"http:\/\/chart.apis.google.com\/chart?cht=lc&amp;chs=800x350&amp;chtt=SQL+chart+by+common_schema&amp;chxt=x,y&amp;chxr=1,11.9,161.7&amp;chd=s:S9NOOGKFGKHQMONPONONNKNONNOOQINMRgLLNMMNNNNNNOONMNNNMHEFFJFfsLLMMMLLMNMMNNDVNIMKPaKLLMOMNNNONNNMMMMM,IiGGFCDBCBGFGGGGGFGGFEFGGGGGHDGGJGGGGGFGGGGGGGGGGGGGFCBCCCEHGGGFFFFFGGGFGGAKFDFFIFFFFFFFFFFFFFFFFFFF&amp;chxs=0,505050,10,0,lt&amp;chxl=0:|2010-10-06 20:00:00||||||||||||||||||||||||2010-10-07 20:00:00|||||||||||||||||||||||||2010-10-08 21:00:00|||||||||||||||||||||||||2010-10-09 22:00:00|||||||||||||||||||||||||2010-10-10 23:00:00&amp;chg=1.010101010,25,1,2,0,0&amp;chco=ff8c00,4682b4&amp;chdl=insert per second|update per second&amp;chdlp=b\" width=\"800\" height=\"350\" \/><\/a><\/p><\/blockquote>\n<p>Throw you own query in. Make <strong>1st<\/strong> column your ordering column, <strong>2nd<\/strong> [, <strong>3rd<\/strong>&#8230;] value columns. Provide your own legend. Watch it instantly. And laugh all you want.<\/p>\n<p>Read more about <a href=\"http:\/\/common-schema.googlecode.com\/svn\/trunk\/common_schema\/doc\/html\/charting_routines.html\">common_schema&#8217;s charting routines<\/a>.<\/p>\n<h4>debugged_routines<\/h4>\n<p>The new <strong><a href=\"http:\/\/common-schema.googlecode.com\/svn\/trunk\/common_schema\/doc\/html\/debugged_routines.html\">debugged_routines<\/a><\/strong> view shows you which routines are currently &#8220;<a href=\"http:\/\/common-schema.googlecode.com\/svn\/trunk\/common_schema\/doc\/html\/rdebug_compile_routine.html\">compiled with debug mode<\/a>&#8220;.<\/p>\n<p>I will write more on the state of <a href=\"http:\/\/common-schema.googlecode.com\/svn\/trunk\/common_schema\/doc\/html\/rdebug.html\"><strong>rdebug<\/strong><\/a> in a future post.<\/p>\n<h4>Try it, get it<\/h4>\n<ul>\n<li><em>common_schema<\/em> <strong>2.1<\/strong> comes with over <strong>500<\/strong> tests and fast growing.<\/li>\n<li>It supports MySQL <strong>5.1<\/strong>, <strong>5.5<\/strong>, <strong>5.6<\/strong>, Percona Server and MariaDB.<\/li>\n<li>It has superb documentation (may I say so?) with a lot of examples &amp; drill down into edge cases.<\/li>\n<\/ul>\n<p>You are <strong><a href=\"https:\/\/code.google.com\/p\/common-schema\/\">free to download<\/a><\/strong> and use it.<\/p>\n<p>Your feedback is welcome! Indeed, many of this version&#8217;s improvements originated with community feedback.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>common_schema 2.1 is released! common_schema is your free &amp; open source companion schema within your MySQL server, providing with a function library, scripting capabilities, powerful routines and ready-to-apply information and recommendations. New and noteworthy in version 2.1: Better QueryScript&#8217;s split() functionality Persistent tables for QueryScript: no long held temporary tables Index creation analysis, further range [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[5],"tags":[103,67,120,57,76],"class_list":["post-6398","post","type-post","status-publish","format-standard","hentry","category-mysql","tag-charts","tag-common_schema","tag-development","tag-open-source","tag-queryscript"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2bZZp-1Fc","_links":{"self":[{"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/posts\/6398","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/comments?post=6398"}],"version-history":[{"count":30,"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/posts\/6398\/revisions"}],"predecessor-version":[{"id":6434,"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/posts\/6398\/revisions\/6434"}],"wp:attachment":[{"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/media?parent=6398"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/categories?post=6398"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/tags?post=6398"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}