{"id":2701,"date":"2013-04-01T18:59:31","date_gmt":"2013-04-01T09:59:31","guid":{"rendered":"https:\/\/gunmagisgeek.com\/wordpress\/?p=2701"},"modified":"2013-12-30T19:42:57","modified_gmt":"2013-12-30T10:42:57","slug":"post-2701","status":"publish","type":"post","link":"https:\/\/gunmagisgeek.com\/blog\/node-js\/2701","title":{"rendered":"\u3010D3.js\u3011Gunma.web\u306e\u30bd\u30fc\u30b7\u30e3\u30eb\u30b0\u30e9\u30d5\u4f5c\u3063\u3066\u307f\u305f\u3002"},"content":{"rendered":"<p>\u30bd\u30fc\u30b7\u30e3\u30eb\u30b0\u30e9\u30d5\u306b\u306f\u6d6a\u6f2b\u304c\u3042\u308b\u3088\u306d\u3002<br \/>\n<a href=\"http:\/\/shimz.me\/example\/d3js\/forcelayout\/gunmaweb\/force.html\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/gunmagisgeek.com\/blog\/wp-content\/uploads\/2013\/04\/colormap000002.jpg\" alt=\"colormap000002\" width=\"600\" height=\"422\" class=\"aligncenter size-full wp-image-2702\" srcset=\"https:\/\/gunmagisgeek.com\/blog\/wp-content\/uploads\/2013\/04\/colormap000002.jpg 600w, https:\/\/gunmagisgeek.com\/blog\/wp-content\/uploads\/2013\/04\/colormap000002-213x150.jpg 213w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<p>\u30bd\u30fc\u30b7\u30e3\u30eb\u30b0\u30e9\u30d5\u3092\u4f5c\u3063\u3066\u307f\u305f\u304b\u3063\u305f\u306e\u3067\u3001Gunma.web\u306b\u53c2\u52a0\u3055\u308c\u305f\u30e6\u30fc\u30b6\u30fc\u306e\u30b0\u30e9\u30d5\u3092\u4f5c\u3063\u3066\u307f\u307e\u3057\u305f\u3002<br \/>\n\u30e6\u30fc\u30b6\u30fc\u9593\u306e\u30ea\u30f3\u30af\u306f\u3001\u540c\u3058\u30a4\u30d9\u30f3\u30c8\u306b\u53c2\u52a0\u3057\u3066\u3044\u308b\u56de\u6570\u304c\u591a\u3044\u307b\u3069\u592a\u304f\u8868\u793a\u3055\u308c\u307e\u3059\u3002<br \/>\n\u30a2\u30a4\u30b3\u30f3\u3084\u30e6\u30fc\u30b6\u30fc\u540d\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u30ea\u30f3\u30af\u304c\u5f37\u8abf(\u8d64)\u3055\u308c\u307e\u3059\u3002<br \/>\n\uff08\u30a2\u30a4\u30b3\u30f3\u753b\u50cf\u306fATND\u304b\u3089\u76f4\u3067\u8aad\u307f\u8fbc\u3093\u3067\u3044\u308b\u306e\u3067\u3001\u305d\u306e\u3046\u3061\u5f3e\u304b\u308c\u308b\u304b\u3082\uff09<\/p>\n<p><a href=\"http:\/\/shimz.me\/example\/d3js\/forcelayout\/gunmaweb\/force.html\">Gunma.web Social Graph<\/a><br \/>\n\u6fc0\u91cd\u3067\u3059\u3002\u3067\u304d\u308c\u3070Chrome\u3067\u898b\u3066\u3084\u3063\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>Gunma.web\u306b\u3064\u3044\u3066\u306f<a href=\"http:\/\/gunma-web.org\/\">\u3053\u3061\u3089<\/a><\/p>\n<h2>\u3084\u3063\u305f\u3053\u3068<\/h2>\n<ol>\n<li>ATND\u304b\u3089\u30a4\u30d9\u30f3\u30c8\u53c2\u52a0\u30e6\u30fc\u30b6\u306e\u53d6\u5f97<\/li>\n<li>\u30a4\u30d9\u30f3\u30c8\u306b\u53c2\u52a0\u3057\u305f\u30e6\u30fc\u30b6\u30fc\u306e\u7d44\u307f\u5408\u308f\u305b\uff08Combination\uff09\u30ea\u30b9\u30c8\u4f5c\u6210<\/li>\n<li>\u91cd\u8907\u3059\u308b\u7d44\u307f\u5408\u308f\u305b\u3092\u30ab\u30a6\u30f3\u30c8(\u540c\u3058\u30a4\u30d9\u30f3\u30c8\u306b\u53c2\u52a0\u3057\u3066\u3044\u308b\u56de\u6570)<\/li>\n<li>\u4e0a\u8a18\u306e\u30c7\u30fc\u30bf\u3092CSV\u3067\u51fa\u529b<\/li>\n<li>CSV\u30d5\u30a1\u30a4\u30eb\u3092D3.js\u3067JSON\u306b\u5909\u63db<\/li>\n<li>Force Layoutd\u3067\u8868\u793a<\/li>\n<\/ol>\n<h2>\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u306e\u4f5c\u6210(\u624b\u4f5c\u696d\u591a\u3081)<\/h2>\n<p>ATND\u304b\u3089\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3059\u308b\u30b9\u30af\u30ea\u30d7\u30c8\u3092node.js\u3067\u4f5c\u6210\u3057\u307e\u3059\u3002<br \/>\n(API\u3092\u4f7f\u3048\u3070\u3088\u304b\u3063\u305f\u3068\u3044\u3046\u3053\u3068\u306b\u5f8c\u3067\u6c17\u4ed8\u304d\u307e\u3057\u305f\u304c\u3001\u5f8c\u306e\u796d\u308a)<\/p>\n<p>\u307e\u305a\u306f\u3001\u5fc5\u8981\u306a\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"lang:sh decode:true \" >$ npm install request\n$ npm install cheerio\n<\/pre>\n<p>Atnd\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0\u7528\u30b9\u30af\u30ea\u30d7\u30c8(atnd.js)<\/p>\n<pre class=\"lang:js decode:true \" >var request = require(\"request\");\nvar cheerio = require(\"cheerio\");\nvar atndId  = process.argv[2];\nif(!atndId){\n\tconsole.log('Not Found atndId')\n\treturn ;\n}\n\nrequest({\n\turi: \"http:\/\/atnd.org\/events\/\" + atndId,\n\t}, function(error, response, body) {\n\tvar $ = cheerio.load(body);\n\tvar user =[]; \n\n\t$(\".a-b &gt; li &gt; span\").each(function() {\n\t\tvar link = $(this).find('a');\n\t\tvar text = link.text();\n\t\tuser.push(text);\n\t});\n\n\tvar n = user.length;\n\tvar i, j;\n\n\tfor(i = 0; i &lt; n; i++){\n\t\tfor(j = i + 1; j &lt; n; j++){\n\t\t\tconsole.log(user[i] + \", \" + user[j]);\n\t\t}\n\t}\n});\n<\/pre>\n<p>&nbsp;<br \/>\n\u5b9f\u884c<\/p>\n<pre class=\"lang:sh decode:true \" >$ node atnd.js [ATND\u30da\u30fc\u30b8\u306eID] > gunmaweb1.txt\n<\/pre>\n<p>\u5b9f\u884c\u3059\u308b\u3068\u5bfe\u8c61\u306eATND\u30da\u30fc\u30b8\u304b\u3089\u53c2\u52a0\u30e6\u30fc\u30b6\u30fc\u3092\u53d6\u5f97\u3057\u3001\u5168\u3066\u306e\u7d44\u307f\u5408\u308f\u305b\u3092\u51fa\u529b\u3057\u307e\u3059\u3002<br \/>\n\u3053\u308c\u3092gunma.web\uff5egunma.web#12\u307e\u3067\u7e70\u308a\u8fd4\u3057\u3001\u5168\u3066\u306e\u30e6\u30fc\u30b6\u30fc\u7d44\u307f\u5408\u308f\u305b\u3092\u53d6\u5f97\u3002<\/p>\n<p>&nbsp;<br \/>\n\u51fa\u529b\u3057\u305f\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3092cat\u30b3\u30de\u30f3\u30c9\u3067\u4e00\u3064\u306b\u307e\u3068\u3081\u307e\u3059\u3002<\/p>\n<pre class=\"lang:sh decode:true \" >$ cat * &gt; user.txt\n<\/pre>\n<p>&nbsp;<br \/>\n\u91cd\u8907\u3057\u3066\u3044\u308b\u7d44\u307f\u5408\u308f\u305b\u3092\u30ab\u30a6\u30f3\u30c8\u3057\u3001\u30e6\u30cb\u30fc\u30af\u306a\u30e6\u30fc\u30b6\u30fc\u7d44\u307f\u5408\u308f\u305b\u306e\u307f\u306e\u30ea\u30b9\u30c8\u306b\u5909\u63db\u3057\u307e\u3059<\/p>\n<pre class=\"lang:sh decode:true \" >cat user.txt|sort|uniq -c &gt; ulist.txt\n<\/pre>\n<p>\uff08\u3053\u308c\u3067\u8a08\u7b97\u3042\u3063\u3066\u3044\u308b\u306f\u305a\u2026\u2026\u305f\u3076\u3093\uff09<\/p>\n<p>&nbsp;<br \/>\n\u4f5c\u6210\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u3092Excel\u3067\u8aad\u307f\u8fbc\u307f\u300c\u30c7\u30fc\u30bf\u2192\u533a\u5207\u308a\u4f4d\u7f6e\u300d\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u300c\u91cd\u8907\u30ab\u30a6\u30f3\u30c8(value),\u30e6\u30fc\u30b6\u30fc\uff08source\uff09\u3001\u30e6\u30fc\u30b6\u30fc\uff08target\uff09\u300d\u306e\u30ea\u30b9\u30c8\u306b\u5909\u63db\u3057csv\u3067\u4fdd\u5b58\u3057\u307e\u3059\u3002<br \/>\n\u51fa\u6765\u4e0a\u304c\u3063\u305f\u306e\u304c\u4e0b\u8a18csv\u30d5\u30a1\u30a4\u30eb\u3067\u3059\u3002<br \/>\n<a href=\"http:\/\/shimz.me\/example\/d3js\/forcelayout\/gunmaweb\/data.csv\">data.csv<\/a><\/p>\n<p>\u3053\u306ecsv\u3092Force Layout\u3067\u4f7f\u7528\u3067\u304d\u308b\u3088\u3046\u306bJSON\u306b\u5909\u63db\u3057\u307e\u3059\u3002<br \/>\nd3.js\u3092\u4f7f\u3063\u3066\u5909\u63db\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002<\/p>\n<pre class=\"lang:js decode:true \" >d3.csv('data.csv', function(data){\n\n\n\tgraph = {'nodes': [], 'links': [] };\n\n\tdata.forEach(function(d){\n\t\tgraph.nodes.push({'name': d.source });\n\t\tgraph.nodes.push({'name': d.target });\n\n\t\tgraph.links.push({\n\t\t\t'source': d.source,\n\t\t\t'target': d.target,\n\t\t\t'value': d.value\n\t\t});\n\t})\n\tgraph.nodes = d3.keys(\n\t\td3.nest()\n\t\t.key(function(d) { return d.name; })\n\t\t.map(graph.nodes)\n\t);\n\n\tgraph.links.forEach(function(d, i){\n\t\tgraph.links[i].source = graph.nodes.indexOf(graph.links[i].source);\n\t\tgraph.links[i].target = graph.nodes.indexOf(graph.links[i].target);\n\t});\n\n\n\tgraph.nodes.forEach(function(d,i){\n\t\tgraph.nodes[i] = {'name': d };\n\t});\n\t\n\n\tvar jsonData = JSON.stringify(graph);\n\t\/\/\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2\u306b\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\n\td3.select('body').append('textarea').text(jsonData);\t\n\n});\n<\/pre>\n<p><a href=\"http:\/\/shimz.me\/example\/d3js\/forcelayout\/gunmaweb\/convert.html\">example convert.html<\/a><br \/>\n\u4e0a\u8a18\u306e\u30c7\u30fc\u30bf\u3092json\u30d5\u30a1\u30a4\u30eb\u3068\u3057\u3066\u4fdd\u5b58\u3057\u3066\u3001\u30c7\u30fc\u30bf\u4f5c\u6210\u306f\u5b8c\u4e86\u3067\u3059\u3002<\/p>\n<p>source,target\u306e\u30ea\u30b9\u30c8\u304b\u3089node\u3068link\u3092\u542b\u3080\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u308b\u4f5c\u696d\u306b\u3064\u3044\u3066\u306f\u3001<a href=\"https:\/\/leanpub.com\/D3-Tips-and-Tricks\">D3 Tips and Tricks<\/a>\u300cSankey Diagramsn\u300d\u306e\u7ae0\u306b\u8a73\u3057\u304f\u63b2\u8f09\u3055\u308c\u3066\u3044\u307e\u3059\u306e\u3067\u8208\u5473\u3042\u308b\u65b9\u306f\u53c2\u7167\u304f\u3060\u3055\u3044\u3002<\/p>\n<h2>Force Layout \u8868\u793a<\/h2>\n<p>Force Layout\u306b\u3064\u3044\u3066\u306f<a href=\"https:\/\/github.com\/mbostock\/d3\/wiki\/Force-Layout\">\u3053\u3061\u3089<\/a>\u3092<\/p>\n<pre class=\"lang:js decode:true \" >d3.json('data.json', function(data){\n\t\t\t\n\tvar w = d3.select('body').style('width').replace('px','');\n\tvar h = 1000;\n\t\n\t\/\/dataSet value\u306e\u6700\u5927\u5024\u53d6\u5f97\n\tvar valueMax = d3.max(data.links, function(d){ return d.value });\n\t\t\t\n\tvar opacityScale = d3.scale.linear().domain([0, valueMax]).range([0.4, 0.8]);\t\t\/\/value\u306e\u5024\u306b\u3088\u3063\u3066\u900f\u660e\u5ea6\u3092\u5909\u5316\u3055\u305b\u308b\n\tvar colorScale = d3.scale.linear().domain([0, valueMax]).range([\"white\", \"blue\"]); \/\/value\u306e\u5024\u306b\u3088\u3063\u3066\u30ab\u30e9\u30fc\u3092\u5909\u5316\u3055\u305b\u308b\n\t\n\n\t\/\/\u30b0\u30e9\u30d5\u3092\u63cf\u753b\u3059\u308b\u30b9\u30c6\u30fc\u30b8\uff08svg\u30bf\u30b0\uff09\u3092\u8ffd\u52a0\n\tvar svg = d3.select(\"svg\").attr(\"width\", w).attr(\"height\", h);\n\n\t\/\/\u30b0\u30e9\u30d5\u30bf\u30a4\u30c8\u30eb\u8ffd\u52a0\n\tsvg.append('text')\n\t\t.attr({\n\t\t\tx:10,\n\t\t\ty:80,\n\t\t\tfill: \"white\",\n\t\t\t\"font-size\":60\n\t\t})\n\t\t.text(\"Gunma.web Social Graph\");\n\t \n\t\/\/\u30b0\u30e9\u30d5\u306e\u521d\u671f\u8a2d\u5b9a\n\tvar force  = d3.layout.force()\n\t\t.nodes(data.nodes)\n\t\t.links(data.links)\n\t\t.gravity(.05) \/\/\u91cd\u529b\n\t\t.distance(500) \/\/\u30ce\u30fc\u30c9\u9593\u306e\u8ddd\u96e2\n\t\t.charge(-300) \/\/\u5404\u30ce\u30fc\u30c9\u306e\u5f15\u304d\u5408\u3046or\u53cd\u767a\u3057\u3042\u3046\u529b\n\t\t.size([w, h]); \/\/\u56f3\u306e\u30b5\u30a4\u30ba\n\t\n\t\n\t\/\/\u30e6\u30fc\u30b6\u30fc\u9593\u306e\u30ea\u30f3\u30af\u4f5c\u6210\n\tvar link = svg.selectAll(\"line.link\")\n\t\t.data(force.links(), function(d, i) {  return d.source + '-' + d.target; }) \/\/links\u30c7\u30fc\u30bf\u3092\u8981\u7d20\u306b\u30d0\u30a4\u30f3\u30c9\n\t\t.enter().append(\"svg:line\")\n\t\t.attr({\n\t\t\t\"class\":function(d){ return \"link \" + \"l\"+data.nodes[d.source].name.replace(\/.\/g,'') + \" \" + \"l\"+data.nodes[d.target].name.replace(\/.\/g,'') }, \n\t\t\t\"stroke\": 'blue',\n\t\t\t\"stroke-opacity\":function(d){ return opacityScale(d.value) },\n\t\t\t\"stroke-width\":function(d){ return d.value } \n\t\t});\n\t\t\t\n\t\n\t\/\/node\u30c7\u30fc\u30bf\u3092\u30d0\u30a4\u30f3\u30c7\u30a3\u30f3\u30b0 \n\tvar node = svg.selectAll(\"g.node\").data(force.nodes(), function(d) { return d.name;} );\n\t\n\t\/\/\u30e6\u30fc\u30b6\u30fc\u30b0\u30eb\u30fc\u30d7\n\tvar nodeEnter = node.enter().append(\"g\")\n\t\t.attr(\"class\", \"node\")\n\t\t.attr(\"id\", function(d){ return d.name.replace(\/.\/g,'') }) \n\t\t.on('click', function(){\n\t\t\td3.selectAll(\".link\").attr(\"stroke\", \"blue\")\n\t\t\td3.selectAll(\".l\"+d3.select(this).attr('id'))\n\t\t\t.attr(\"stroke\", \"red\")\n\t\t})\n\t\t.call(force.drag); \/\/\u30ce\u30fc\u30c9\u3092\u30c9\u30e9\u30c3\u30b0\u3067\u304d\u308b\u3088\u3046\u306b\u8a2d\u5b9a\n\t\n\t\/\/\u30e6\u30fc\u30b6\u30fc\u30a2\u30a4\u30b3\u30f3\u8ffd\u52a0\n\tnodeEnter.append(\"image\")\n\t\t.attr(\"class\", \"user\")\n\t\t.attr({\n\t\t\t\"xlink:href\":function(d){ return d.img }, \/\/\u30ce\u30fc\u30c9\u7528\u753b\u50cf\u306e\u8a2d\u5b9a\n\t\t\t\"x\":\"-16px\",\n\t\t\t\"y\":\"-16px\",\n\t\t\t\"width\":\"32px\",\n\t\t\t\"height\":\"32px\"\n\t\t});\n\t\n\t\/\/\u30e6\u30fc\u30b6\u30fc\u540d\u8ffd\u52a0 \n\tnodeEnter.append(\"text\")\n\t\t.attr(\"class\", \"nodetext\")\n\t\t.attr({\n\t\t\t\"dx\":30,\n\t\t\t\"dy\":\".35em\",\n\t\t\t\"fill\":\"white\"\n\t\t})\n\t\t.text(function(d) { return d.name });\n\t\n\t\/\/\u30d5\u30a9\u30fc\u30b9\u30ec\u30a4\u30a2\u30a6\u30c8\u306e\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u59cb\n\tforce.start();\n\t\n\t\/\/\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u30eb\u30fc\u30d7\n\tforce.on(\"tick\", function() {\n\t\tnode.attr(\"transform\", function(d) { return \"translate(\" + d.x + \",\" + d.y + \")\"; });\n\t\tlink.attr({\n\t\t\tx1: function(d) { return d.source.x; },\n\t\t\ty1: function(d) { return d.source.y; },\n\t\t\tx2: function(d) { return d.target.x; },\n\t\t\ty2: function(d) { return d.target.y; }\n\t\t});\n\t});\n\t\n\t\t\t\n});\n<\/pre>\n<p><a href=\"http:\/\/shimz.me\/example\/d3js\/forcelayout\/gunmaweb\/force.html\">example<\/a><\/p>\n<h2>\u3084\u3063\u3066\u307f\u3066\u308f\u304b\u3063\u305f\u3053\u3068<\/h2>\n<p>\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3092\u4f5c\u308b\u306e\u304c\u4e00\u756a\u5927\u5909\u3002<br \/>\n\u7279\u306b\u4eca\u56de\u306fwindows\u4e0a\u3067\u4f5c\u696d\u3057\u305f\u306e\u3067SJIS-UTF8\u306e\u5909\u63db\u3092\u7e70\u308a\u8fd4\u3059\u7fbd\u76ee\u306b\u306a\u3063\u3066\u3057\u307e\u3063\u305f\u3002<br \/>\nnkf\u306f\u3084\u3063\u3071\u308a\u4fbf\u5229\u3002<br \/>\nForce Layou\u306f\u3001\u3046\u307e\u304f\u52d5\u304b\u306a\u304b\u3063\u305f\u3068\u304d\u306e\u30c7\u30d0\u30c3\u30b0\u304c\u96e3\u3057\u3044\u3002<\/p>\n<p>\u672c\u5f53\u306f\u3001\u904e\u53bb\u7fa4\u99ac\u3067\u958b\u50ac\u3055\u308c\u305f\u30a4\u30d9\u30f3\u30c8\u5168\u3066\u304b\u3089\u30c7\u30fc\u30bf\u3092\u53d6\u308d\u3046\u3068\u601d\u3063\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u3001\u529b\u4ed8\u304d\u307e\u3057\u305f\u3002<br \/>\n\u307e\u3041\u3001\u3053\u308c\u4ee5\u4e0a\u30c7\u30fc\u30bf\u304c\u591a\u304f\u306a\u308b\u3068\u898b\u3065\u3089\u304f\u306a\u308b\u3057\u3002<br \/>\n\u611a\u76f4\u306b\u30c7\u30fc\u30bf\u3092\u5168\u3066\u8868\u793a\u3059\u308b\u306e\u3067\u306f\u306a\u304f\u3001\u7a0b\u3088\u304f\u7701\u7565\u3057\u3066\u30d5\u30a9\u30fc\u30ab\u30b9\u304c\u5f53\u305f\u3063\u305f\u3068\u304d\u306b\u8a73\u7d30\u3092\u8868\u793a\u3059\u308b\uff08\u30ba\u30fc\u30e0\uff0f\u30d1\u30f3\uff09\u51e6\u7406\u3092\u884c\u3044\u305f\u3044\u306e\u3067\u3059\u304c\u3001\u306a\u304b\u306a\u304b\u3046\u307e\u304f\u3044\u304d\u307e\u305b\u3093 orz <\/p>\n<p>\u305d\u306e\u8fba\u306e\u51e6\u7406\u304c\u3061\u3083\u3093\u3068\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u3063\u305f\u3089\u518d\u6311\u6226\u3057\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>&nbsp;<br \/>\n&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u30bd\u30fc\u30b7\u30e3\u30eb\u30b0\u30e9\u30d5\u306b\u306f\u6d6a\u6f2b\u304c\u3042\u308b\u3088\u306d\u3002 \u30bd\u30fc\u30b7\u30e3\u30eb\u30b0&hellip;<\/p>\n","protected":false},"author":1,"featured_media":2702,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18,5],"tags":[],"class_list":["post-2701","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-d3-js","category-node-js","has-post-thumbnail-archive"],"_links":{"self":[{"href":"https:\/\/gunmagisgeek.com\/blog\/wp-json\/wp\/v2\/posts\/2701","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gunmagisgeek.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gunmagisgeek.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gunmagisgeek.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gunmagisgeek.com\/blog\/wp-json\/wp\/v2\/comments?post=2701"}],"version-history":[{"count":1,"href":"https:\/\/gunmagisgeek.com\/blog\/wp-json\/wp\/v2\/posts\/2701\/revisions"}],"predecessor-version":[{"id":2932,"href":"https:\/\/gunmagisgeek.com\/blog\/wp-json\/wp\/v2\/posts\/2701\/revisions\/2932"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gunmagisgeek.com\/blog\/wp-json\/wp\/v2\/media\/2702"}],"wp:attachment":[{"href":"https:\/\/gunmagisgeek.com\/blog\/wp-json\/wp\/v2\/media?parent=2701"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gunmagisgeek.com\/blog\/wp-json\/wp\/v2\/categories?post=2701"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gunmagisgeek.com\/blog\/wp-json\/wp\/v2\/tags?post=2701"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}