{"id":1521,"date":"2014-12-16T19:20:48","date_gmt":"2014-12-16T19:20:48","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1521"},"modified":"2014-12-16T19:20:48","modified_gmt":"2014-12-16T19:20:48","slug":"building-membase-sources","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/","title":{"rendered":"Building membase from the sources&#8230;"},"content":{"rendered":"<p>I thought I should share some information about my personal development model for membase.<\/p>\n<p>I&#39;ve set up a &#8220;sandbox&#8221; where I&#39;m doing all of my development in with the following commands:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">trond@opensolaris> pfexec zfs create -o mountpoint=\/source rpool\/source<br \/>trond@opensolaris> pfexec chown trond:staff \/source<br \/>trond@opensolaris> mkdir \/source\/membase<br \/>trond@opensolaris> cd \/source\/membase<br \/>trond@opensolaris> git clone git:\/\/github.com\/trondn\/tools.git<br \/>trond@opensolaris> cd tools\/membase<\/div>\n<\/div>\n<p>I like to keep my changes as separated as possible, to reduce the dependencies between them. Whenever I am fixing a bug report I would do something like:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">trond@opensolaris> mkdir bugnnn<br \/>trond@opensolaris> cd bugnnn<br \/>trond@opensolaris> ln -s ..\/Makefile<br \/>trond@opensolaris> make<\/div>\n<\/div>\n<p>That would build the entire Membase stack and put the files in <code><font color=\"#999999\">\/tmp\/membase-build<\/font><\/code>. I would then change my working directory to the module where I&#39;m going to fix a bug and (hopefully) fix it.<\/p>\n<p>After fixing the bug (and writing a test case!) I would commit the change and push it for review with the following commands:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">trond@opensolaris> git add -p \u00a0 (and select the changes to include)<br \/>trond@opensolaris> git commit -m &#8220;bugnnn: blah blah blah&#8221;<\/b><br \/>trond@opensolaris> git for-review<\/div>\n<\/div>\n<p>The last command there would push the change to our review system, so that Dustin or someone else can read through the diffs and accept the patch if they like it.<\/p>\n<p>If you look at the workflow above it looks pretty easy, there is however one little thing that is really annoying&#8230; That is that Membase is a cross platform project, so I need to ensure that the code compiles and works on all of our platforms. With the method above I would have to log into another system and set everything up and copy my change over to see that it works. For simple changes that only touch one module I could always use buildbot or Hudson to test it on all platforms, but that doesn&#39;t work if I do an interface change that affects all of our modules.<\/p>\n<p>I&#39;m kind of lazy so I don&#39;t want to do such boring work all of the time, so instead I wrote a script to set up the sources and create makefiles so that I can easily build the same source tree on all of my platforms.<\/p>\n<p>In order for it to work you need to set up sharing on your filesystem:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">trond@opensolaris> pfexec zfs set sharenfs=on rpool\/source<br \/>trond@opensolaris> pfexec zfs set sharesmb=name=source rpool\/source<\/div>\n<\/div>\n<p>To set up a tree for lets say bug 9999 I would run something like:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">trond@opensolaris> .\/setup.sh bug_9999<br \/>Download commit hook &#8211; Ok.<br \/>Checking out libmemcached (Bazaar) &#8211; Ok.<br \/>\u00a0 Generate configure script &#8211; Ok.<br \/>Checking out bucket_engine (git) &#8211; Ok.<br \/>Checking out ep-engine (git) &#8211; Ok.<br \/>\u00a0 Generate configure script &#8211; Ok.<br \/>Checking out libconflate (git) &#8211; Ok.<br \/>\u00a0 Generate configure script &#8211; Ok.<br \/>Checking out libvbucket (git) &#8211; Ok.<br \/>\u00a0 Generate configure script &#8211; Ok.<br \/>Checking out memcached (git) &#8211; Ok.<br \/>\u00a0 Generate configure script &#8211; Ok.<br \/>Checking out moxi (git) &#8211; Ok.<br \/>\u00a0 Generate configure script &#8211; Ok.<br \/>Checking out vbucketmigrator (git) &#8211; Ok.<br \/>\u00a0 Generate configure script &#8211; Ok.<br \/>Checking out membase-cli (git) &#8211; Ok.<br \/>Checking out ns_server (git) &#8211; Ok.<br \/>Checking out memcachetest (git) &#8211; Ok.<br \/>\u00a0 Generate configure script &#8211; Ok.<br \/>Configure build for SunOS<\/div>\n<\/div>\n<p>This will set up a build environemnt for Solaris that builds membase as a &#8220;multi isa&#8221; (both 32 and 64 bit) stack in <code><font color=\"#999999\">\/tmp\/membase<\/font><\/code>. But let&#39;s add support for my MacOSX, Ubuntu and Debian box as well. Since all of the code is located on my opensolaris box, I need to use the <code><font color=\"#999999\">-s<\/font><\/code> option to let it know where the source is located:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">trond@opensolaris> .\/setup.sh -s \/net\/opensolaris\/source\/membase\/tools\/membase -p Ubuntu bug_9999<br \/>Configure build for Ubuntu<br \/>trond@opensolaris> .\/setup.sh -s \/net\/opensolaris\/source\/membase\/tools\/membase -p Darwin bug_9999<br \/>Configure build for Darwin<br \/>trond@opensolaris> .\/setup.sh -s \/net\/opensolaris\/source\/membase\/tools\/membase -p Debian bug_9999<br \/>Configure build for Debian<\/div>\n<\/div>\n<p>So let&#39;s look inside the <code><font color=\"#999999\">bug_9999<\/font><\/code> directory:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">trond@opensolaris> ls -l bug_9999<br \/>total 15<br \/>drwxr-xr-x \u00a013 trond \u00a0 \u00a0staff \u00a0 \u00a0 \u00a0 \u00a0 14 Oct 12 13:35 Darwin<br \/>drwxr-xr-x \u00a013 trond \u00a0 \u00a0staff \u00a0 \u00a0 \u00a0 \u00a0 14 Oct 12 13:35 Debian<br \/>drwxr-xr-x \u00a013 trond \u00a0 \u00a0staff \u00a0 \u00a0 \u00a0 \u00a0 14 Oct 12 13:33 src<br \/>drwxr-xr-x \u00a0 4 trond \u00a0 \u00a0staff \u00a0 \u00a0 \u00a0 \u00a0 \u00a05 Oct 12 13:33 SunOS<br \/>drwxr-xr-x \u00a013 trond \u00a0 \u00a0staff \u00a0 \u00a0 \u00a0 \u00a0 14 Oct 12 13:35 Ubuntu<\/div>\n<\/div>\n<p>All of the sources are located in the src directory, and all of the makefiles for the various platforms will reference that code.<\/p>\n<p>To build on all of my platforms I&#39;m just executing:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">trond@opensolaris> ssh ubuntu &#8220;cd \/net\/opensolaris\/source\/membase\/tools\/membase\/bug_9999\/Ubuntu &#038;&#038; make&#8221; > ubuntu.log 2>&#038;1 &#038;<br \/>trond@opensolaris> ssh debian &#8220;cd \/net\/opensolaris\/source\/membase\/tools\/membase\/bug_9999\/Debian &#038;&#038; make&#8221; > debian.log 2>&#038;1 &#038;<br \/>trond@opensolaris> ssh darwin &#8220;cd \/net\/opensolaris\/source\/membase\/tools\/membase\/bug_9999\/Darwin &#038;&#038; make&#8221; > darwin.log 2>&#038;1 &#038;<\/div>\n<\/div>\n<p>but I&#39;ve got that in a script of course:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">trond@opensolaris> <b>cat bug_9999\/build.sh<\/b><br \/>#! \/bin\/ksh<br \/>cd SunOS &#038;&#038; gmake > sunos.log 2>&#038;1 &#038;<br \/>ssh ubuntu &#8220;cd \/net\/opensolaris\/source\/membase\/tools\/membase\/bug_9999\/Ubuntu &#038;&#038; make&#8221; > ubuntu.log 2>&#038;1 &#038;<br \/>ssh debian &#8220;cd \/net\/opensolaris\/source\/membase\/tools\/membase\/bug_9999\/Debian &#038;&#038; make&#8221; > debian.log 2>&#038;1 &#038;<br \/>ssh darwin &#8220;cd \/net\/opensolaris\/source\/membase\/tools\/membase\/bug_9999\/Darwin &#038;&#038; make&#8221; > darwin.log 2>&#038;1 &#038;<br \/>xterm -T SunOS -e tail -f sunos.log &#038;<br \/>xterm -T Ubuntu -e tail -f ubuntu.log &#038;<br \/>xterm -T Debian -e tail -f debian.log &#038;<br \/>xterm -T MacOS -e tail -f darwin.log &#038;<\/div>\n<\/div>\n<p>Unfortunately you can&#39;t start the membase we just installed in <code><font color=\"#999999\">\/tmp\/membase<\/font><\/code>, but I&#39;m working on it!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I thought I should share some information about my personal development model for membase. I&#39;ve set up a &#8220;sandbox&#8221; where I&#39;m doing all of my development in with the following commands: trond@opensolaris> pfexec zfs create -o mountpoint=\/source rpool\/sourcetrond@opensolaris> pfexec chown [&hellip;]<\/p>\n","protected":false},"author":14,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[8981],"class_list":["post-1521","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Building membase from the sources... - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building membase from the sources...\" \/>\n<meta property=\"og:description\" content=\"I thought I should share some information about my personal development model for membase. I&#039;ve set up a &#8220;sandbox&#8221; where I&#039;m doing all of my development in with the following commands: trond@opensolaris&gt; pfexec zfs create -o mountpoint=\/source rpool\/sourcetrond@opensolaris&gt; pfexec chown [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T19:20:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Trond Norbye, Senior Developer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Trond Norbye, Senior Developer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/\"},\"author\":{\"name\":\"Trond Norbye, Senior Developer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ef0f9ff42d878c2fc0ab3a685e96f36d\"},\"headline\":\"Building membase from the sources&#8230;\",\"datePublished\":\"2014-12-16T19:20:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/\"},\"wordCount\":897,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/\",\"name\":\"Building membase from the sources... - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T19:20:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building membase from the sources&#8230;\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ef0f9ff42d878c2fc0ab3a685e96f36d\",\"name\":\"Trond Norbye, Senior Developer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/03d13b4ab5eaa14c91cab7658f04df07\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g\",\"caption\":\"Trond Norbye, Senior Developer, Couchbase\"},\"description\":\"Trond Norbye is a Software Architect at Couchbase. Core contributor to Couchbase &amp; Memcached projects. Created the C\/C++ &amp; node.js Couchbase client libraries.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/trond-norbye\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Building membase from the sources... - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/","og_locale":"en_US","og_type":"article","og_title":"Building membase from the sources...","og_description":"I thought I should share some information about my personal development model for membase. I&#39;ve set up a &#8220;sandbox&#8221; where I&#39;m doing all of my development in with the following commands: trond@opensolaris> pfexec zfs create -o mountpoint=\/source rpool\/sourcetrond@opensolaris> pfexec chown [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T19:20:48+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Trond Norbye, Senior Developer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Trond Norbye, Senior Developer, Couchbase","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/"},"author":{"name":"Trond Norbye, Senior Developer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ef0f9ff42d878c2fc0ab3a685e96f36d"},"headline":"Building membase from the sources&#8230;","datePublished":"2014-12-16T19:20:48+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/"},"wordCount":897,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/","url":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/","name":"Building membase from the sources... - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T19:20:48+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/building-membase-sources\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/building-membase-sources\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Building membase from the sources&#8230;"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ef0f9ff42d878c2fc0ab3a685e96f36d","name":"Trond Norbye, Senior Developer, Couchbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/03d13b4ab5eaa14c91cab7658f04df07","url":"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g","caption":"Trond Norbye, Senior Developer, Couchbase"},"description":"Trond Norbye is a Software Architect at Couchbase. Core contributor to Couchbase &amp; Memcached projects. Created the C\/C++ &amp; node.js Couchbase client libraries.","url":"https:\/\/www.couchbase.com\/blog\/author\/trond-norbye\/"}]}},"authors":[{"term_id":8981,"user_id":14,"is_guest":0,"slug":"trond-norbye","display_name":"Trond Norbye, Senior Developer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g","author_category":"","last_name":"Norbye","first_name":"Trond","job_title":"","user_url":"","description":"Trond Norbye is a Software Architect at Couchbase. Core contributor to Couchbase &amp; Memcached projects. Created the C\/C++ &amp; node.js Couchbase client libraries."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1521","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=1521"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1521\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=1521"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=1521"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=1521"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=1521"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}