{"id":58,"date":"2010-06-28T19:39:00","date_gmt":"2010-06-29T02:39:00","guid":{"rendered":"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/harvest-gsoc-project-week-5\/"},"modified":"2024-08-14T09:20:05","modified_gmt":"2024-08-14T16:20:05","slug":"harvest-gsoc-project-week-5","status":"publish","type":"post","link":"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/","title":{"rendered":"Harvest GSoC project: week 5!"},"content":{"rendered":"\n<p>The last two weeks of my Harvest project have gone really well. It isn&#8217;t flashy and exciting and earth-shattering (yet), but I&#8217;m happy with it.<\/p>\n\n\n\n<p>First of all, my branch now has Packages and Opportunities filters. I implemented a bunch of each, and they are resolved in order. First Harvest runs the package filters, then it filters the opportunities that belong to those packages, then it hides packages that have no visible opportunities after all that filtering.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>After a long period of me obsessively poking things, Daniel talked me into making <a href=\"https:\/\/code.launchpad.net\/~dylanmccall\/harvest\/harvest-dylan-m\/+merge\/28262\">a merge request for my branch<\/a> (to lp:harvest). He and James W gave it some really thorough code review, which has been a huge help! Now it all feels tidier and a little more justified, so I can use the code I wrote without that constant temptation to rewrite it.<\/p>\n\n\n\n<p>At this point, performance is <em>much<\/em> improved. Details are only shown for one package at a time, so the incredibly long waits (and self-destructs) have gone away.<\/p>\n\n\n\n<p>In addition, the filter system consistently does 4 SQL queries no matter what is being searched for. Of course, that doesn&#8217;t say it&#8217;s running as well as it can, but it does mean the system is more orderly. It only hits the database once for each type of data. (One query for package sets, one for opportunity lists, one for relevant source packages, one for relevant opportunities). This puts more thorough optimization within reach.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/harvest-current-june28-2010\/\" rel=\"attachment wp-att-512\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"288\" height=\"300\" data-attachment-id=\"512\" data-permalink=\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/harvest-current-june28-2010\/\" data-orig-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Current-June28-2010.png?fit=915%2C953&amp;ssl=1\" data-orig-size=\"915,953\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"Harvest-Current-June28-2010\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Current-June28-2010.png?fit=288%2C300&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Current-June28-2010.png?fit=525%2C547&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Current-June28-2010.png?resize=288%2C300&#038;ssl=1\" alt=\"\" class=\"wp-image-512\" title=\"Harvest-Current-June28-2010\" srcset=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Current-June28-2010.png?resize=288%2C300&amp;ssl=1 288w, https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Current-June28-2010.png?resize=720%2C750&amp;ssl=1 720w, https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Current-June28-2010.png?w=915&amp;ssl=1 915w\" sizes=\"auto, (max-width: 288px) 100vw, 288px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Rather than trying to optimizing things for eternity, I&#8217;m off to something completely different for now: fancy Javascript to load new content in line with the page! The idea is a big query will still have a visible wait (always will!), but a complete page won&#8217;t need to be created each time; just the specific results, with a nice spinner while they&#8217;re loaded. Less jumping around, quicker and more fun.<\/p>\n\n\n\n<p>For the first step, I have to admit I got a little carried away and started redoing the base template from scratch. (It should save me some time, really. The Javascript will be attached to some kind of DOM tree and I don&#8217;t want to fiddle with that twice).&nbsp;Still an early WIP, but I think this looks quite pretty :)<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/harvest-redesign-june28-2010\/\" rel=\"attachment wp-att-513\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"525\" height=\"550\" data-attachment-id=\"513\" data-permalink=\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/harvest-redesign-june28-2010\/\" data-orig-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?fit=1038%2C1086&amp;ssl=1\" data-orig-size=\"1038,1086\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"Harvest-Redesign-June28-2010\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?fit=286%2C300&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?fit=525%2C550&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?resize=525%2C550&#038;ssl=1\" alt=\"\" class=\"wp-image-513\" title=\"Harvest-Redesign-June28-2010\" srcset=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?resize=716%2C750&amp;ssl=1 716w, https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?resize=286%2C300&amp;ssl=1 286w, https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?w=1038&amp;ssl=1 1038w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>I am starting with a prototype written in straight HTML; no Django template markup <em>yet<\/em>. It&#8217;s helping me straighten my thoughts for how the filters&#8217; render() functions should link together.&nbsp;The interface is taller than I would like, so I will need to do something to collapse the Choice filters when they aren&#8217;t being used. Oh, and we don&#8217;t seem to have a logo. Still, the gist of it is there.<\/p>\n\n\n\n<p>Next for me is figuring out YUI and making that filter interface on the left interactive.&nbsp;<strong>Really exciting!<\/strong> Javascript toolkits are amazingly fun to use.<\/p>\n\n\n\n<p><small>Speaking of web design, I decided I didn&#8217;t like my nearly-stock Blogger template anymore so I spent <em>way too long<\/em> redesigning it (while cursing Blogger for being an awful platform to make templates with). What do you think?<\/small><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The last two weeks of my Harvest project have gone really well. It isn&#8217;t flashy and exciting and earth-shattering (yet), but I&#8217;m happy with it.<\/p>\n<p>First of all, my branch now has Packages and Opportunities filters. I implemented a bunch of each, and they are resolved in order. First Harvest runs the package filters, then it filters the opportunities that belong to those packages, then it hides packages that have no visible opportunities after all that filtering&hellip;<\/p>\n","protected":false},"author":2,"featured_media":513,"comment_status":"closed","ping_status":"closed","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,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federate","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[35],"tags":[33,36,20,29],"class_list":["post-58","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gsoc-2010","tag-design","tag-django","tag-harvest","tag-web"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Harvest GSoC project: week 5! - Dylan McCall<\/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:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Harvest GSoC project: week 5! - Dylan McCall\" \/>\n<meta property=\"og:description\" content=\"The last two weeks of my Harvest project have gone really well. It isn&#8217;t flashy and exciting and earth-shattering (yet), but I&#8217;m happy with it.  First of all, my branch now has Packages and Opportunities filters. I implemented a bunch of each, and they are resolved in order. First Harvest runs the package filters, then it filters the opportunities that belong to those packages, then it hides packages that have no visible opportunities after all that filtering&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/\" \/>\n<meta property=\"og:site_name\" content=\"Dylan McCall\" \/>\n<meta property=\"article:published_time\" content=\"2010-06-29T02:39:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-08-14T16:20:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1038\" \/>\n\t<meta property=\"og:image:height\" content=\"1086\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Dylan McCall\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dylan McCall\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/\"},\"author\":{\"name\":\"Dylan McCall\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5\"},\"headline\":\"Harvest GSoC project: week 5!\",\"datePublished\":\"2010-06-29T02:39:00+00:00\",\"dateModified\":\"2024-08-14T16:20:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/\"},\"wordCount\":525,\"image\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?fit=1038%2C1086&ssl=1\",\"keywords\":[\"design\",\"django\",\"Harvest\",\"web\"],\"articleSection\":[\"GSoC 2010\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/\",\"url\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/\",\"name\":\"Harvest GSoC project: week 5! - Dylan McCall\",\"isPartOf\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?fit=1038%2C1086&ssl=1\",\"datePublished\":\"2010-06-29T02:39:00+00:00\",\"dateModified\":\"2024-08-14T16:20:05+00:00\",\"author\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/#primaryimage\",\"url\":\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?fit=1038%2C1086&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?fit=1038%2C1086&ssl=1\",\"width\":\"1038\",\"height\":\"1086\"},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#website\",\"url\":\"https:\/\/dylanmc.ca\/\/-\/\",\"name\":\"Dylan McCall\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/dylanmc.ca\/\/-\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5\",\"name\":\"Dylan McCall\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c94ab3a7e6a884542205e0408711cd54bb1fd5f4e90e7a5f621a54656a18a037?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c94ab3a7e6a884542205e0408711cd54bb1fd5f4e90e7a5f621a54656a18a037?s=96&d=mm&r=g\",\"caption\":\"Dylan McCall\"},\"description\":\"Software developer, tea drinker, GNOME contributor. Occasionally a raving fanatic.\",\"sameAs\":[\"https:\/\/dylanmc.ca\/\/-\"],\"url\":\"https:\/\/dylanmc.ca\/\/-\/blog\/author\/dylan\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Harvest GSoC project: week 5! - Dylan McCall","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:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/","og_locale":"en_US","og_type":"article","og_title":"Harvest GSoC project: week 5! - Dylan McCall","og_description":"The last two weeks of my Harvest project have gone really well. It isn&#8217;t flashy and exciting and earth-shattering (yet), but I&#8217;m happy with it.  First of all, my branch now has Packages and Opportunities filters. I implemented a bunch of each, and they are resolved in order. First Harvest runs the package filters, then it filters the opportunities that belong to those packages, then it hides packages that have no visible opportunities after all that filtering&hellip;","og_url":"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/","og_site_name":"Dylan McCall","article_published_time":"2010-06-29T02:39:00+00:00","article_modified_time":"2024-08-14T16:20:05+00:00","og_image":[{"width":1038,"height":1086,"url":"https:\/\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png","type":"image\/png"}],"author":"Dylan McCall","twitter_misc":{"Written by":"Dylan McCall","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/#article","isPartOf":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/"},"author":{"name":"Dylan McCall","@id":"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5"},"headline":"Harvest GSoC project: week 5!","datePublished":"2010-06-29T02:39:00+00:00","dateModified":"2024-08-14T16:20:05+00:00","mainEntityOfPage":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/"},"wordCount":525,"image":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?fit=1038%2C1086&ssl=1","keywords":["design","django","Harvest","web"],"articleSection":["GSoC 2010"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/","url":"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/","name":"Harvest GSoC project: week 5! - Dylan McCall","isPartOf":{"@id":"https:\/\/dylanmc.ca\/\/-\/#website"},"primaryImageOfPage":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/#primaryimage"},"image":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?fit=1038%2C1086&ssl=1","datePublished":"2010-06-29T02:39:00+00:00","dateModified":"2024-08-14T16:20:05+00:00","author":{"@id":"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2010\/06\/28\/harvest-gsoc-project-week-5\/#primaryimage","url":"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?fit=1038%2C1086&ssl=1","contentUrl":"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?fit=1038%2C1086&ssl=1","width":"1038","height":"1086"},{"@type":"WebSite","@id":"https:\/\/dylanmc.ca\/\/-\/#website","url":"https:\/\/dylanmc.ca\/\/-\/","name":"Dylan McCall","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dylanmc.ca\/\/-\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5","name":"Dylan McCall","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c94ab3a7e6a884542205e0408711cd54bb1fd5f4e90e7a5f621a54656a18a037?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c94ab3a7e6a884542205e0408711cd54bb1fd5f4e90e7a5f621a54656a18a037?s=96&d=mm&r=g","caption":"Dylan McCall"},"description":"Software developer, tea drinker, GNOME contributor. Occasionally a raving fanatic.","sameAs":["https:\/\/dylanmc.ca\/\/-"],"url":"https:\/\/dylanmc.ca\/\/-\/blog\/author\/dylan\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Harvest-Redesign-June28-2010.png?fit=1038%2C1086&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcXOQX-W","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/posts\/58","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/comments?post=58"}],"version-history":[{"count":8,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/posts\/58\/revisions"}],"predecessor-version":[{"id":11027,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/posts\/58\/revisions\/11027"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/media\/513"}],"wp:attachment":[{"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/media?parent=58"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/categories?post=58"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/tags?post=58"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}