{"id":1382,"date":"2013-07-01T10:36:54","date_gmt":"2013-07-01T17:36:54","guid":{"rendered":"https:\/\/dylanmc.ca\/\/-\/?p=1382"},"modified":"2021-12-01T11:26:37","modified_gmt":"2021-12-01T19:26:37","slug":"break-timer-gsoc-project-week-2","status":"publish","type":"post","link":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/","title":{"rendered":"GNOME Break Timer: Week 2"},"content":{"rendered":"\n<p>I&#8217;m starting the third week of coding on my GSoC 2013 project, <a title=\"My GSOC 2013 project: a new break timer application for GNOME\" href=\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/06\/23\/my-gsoc-2013-project-break-timer-for-gnome\/\">a new break timer application<\/a> for GNOME. I spent the last two weeks working on an odd mix of little things. For the most part, my goal over that time was to make the gnome-break-timer project (previously brainbreak, still brainbreak in most places) nicer to work with. I&#8217;m a bit of a sucker for clean code, and, well&#8230;<\/p>\n\n\n\n<!--more-->\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"http:\/\/www.bonkersworld.net\/building-software\/\" rel=\"attachment wp-att-1383\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"525\" height=\"399\" data-attachment-id=\"1383\" data-permalink=\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/the-life-of-a-software-engineer\/\" data-orig-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png?fit=600%2C456&amp;ssl=1\" data-orig-size=\"600,456\" 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=\"The Life of a Software Engineer\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;By Manu Cornet, from &lt;a href=&quot;http:\/\/www.bonkersworld.net\/building-software\/&quot;&gt;Bonkers World&lt;\/a&gt;&lt;\/p&gt;\n\" data-medium-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png?fit=300%2C228&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png?fit=525%2C399&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png?resize=525%2C399&#038;ssl=1\" alt=\"By Manu Cornet, from Bonkers World\" class=\"wp-image-1383\" srcset=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png?w=600&amp;ssl=1 600w, https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png?resize=300%2C228&amp;ssl=1 300w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><\/a><figcaption>By Manu Cornet, from <a href=\"http:\/\/www.bonkersworld.net\/building-software\/\">Bonkers World<\/a><\/figcaption><\/figure><\/div>\n\n\n\n<p>So, to start off, I switched over to Automake from my old build system, which was using <a href=\"https:\/\/live.gnome.org\/BuilDj\">BuilDj<\/a> and Waf. I&#8217;m still a big fan of those two, at least philosophically. In practice, Automake just seemed like a good choice because it&#8217;s familiar to people, and I really want to maintain a high bus factor for this project. This isn&#8217;t the sort of application that I would expect to have a continuous flow of regular contributors, so I think it&#8217;s important that someone can jump in and figure it out for without too many obstacles.<\/p>\n\n\n\n<p>One interesting puzzle here was doing a convenience library with Automake and Vala. I started using convenience libraries for this project so I could strictly define different parts of the application. The idea is code at one level shouldn&#8217;t know anything about code above it, and we can formalize that by actually building these bits of code to separate objects that get linked together later. This also, conveniently, allows us to reuse the code that is common between the settings panel and the break timer daemon without needing to compile it twice. Not a big deal here, but I like it anyway.<\/p>\n\n\n\n<p>I found lots of helpful information about doing convenience libraries with Automake, but Vala posed something of a problem because Automake doesn&#8217;t do everything for us with Vala (yet). I need to pass several extra flags to valac, both for the library and for the target that <em>uses<\/em> the library, and I need to do that without messing up build dependencies. I don&#8217;t want to run into cases where the build fails (or, worse, doesn&#8217;t fail!) until I run <code>make clean<\/code>. (For what it&#8217;s worth, the old build system with BuilDj and Waf figured this out wonderfully and generally rebuilt the thing about twice as fast as Automake, but I also hadn&#8217;t set up localization or config.h, so I guess that&#8217;s kind of moot). I checked out how some projects like Deja Dup were doing convenience libraries, and I came up with a handy reusable pattern:<\/p>\n\n\n\n<p>Makefile.am for the rather unhelpfully named &#8220;common&#8221; module:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted prettyprint lang-makefile\">M_CPPFLAGS = $(BRAINBREAK_CFLAGS) \\\n\t-include $(CONFIG_HEADER)\n\nnoinst_LTLIBRARIES = \\\n\t<b>libcommon.la<\/b>\n\nlibcommon_la_SOURCES = \\\n\tNaturalTime.vala \\\n\tSessionStatus.vala \\\n\t...\n\nlibcommon_la_LIBADD = \\\n\t$(BRAINBREAK_LIBS)\n\nlibcommon_la_VALAFLAGS = \\\n\t--pkg gio-2.0 \\\n\t<b>--library common<\/b> \\\n\t<b>--vapi common.vapi<\/b> \\\n\t<b>-H common.h<\/b>\n\njunk_files = \\\n\t$(libcommon_la_SOURCES:.vala=.c) \\\n\t<b>libcommon_la_vala.stamp<\/b>\n\ndist-hook:\n\tcd $(distdir) &amp;&amp; rm -f $(junk_files)\n\nCLEANFILES = \\\n\t$(junk_files) \\\n\t<b>common.vapi<\/b> \\\n\t<b>common.h<\/b><\/pre>\n\n\n\n<p>Makefile.am for some code that uses that module:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted prettyprint lang-makefile\">AM_CPPFLAGS = $(BRAINBREAK_CFLAGS) \\\n\t-include $(CONFIG_HEADER) \\\n\t-I $(top_srcdir)\/common\n\nSUBDIRS = \n\nbin_PROGRAMS = \\\n\tbrainbreak-settings\n\nbrainbreak_settings_SOURCES = \\\n\tApplicationPanel.vala \\\n\tBreakPanel.vala \\\n\tBreakType.vala \\\n\tmain.vala \\\n\t...\n\nbrainbreak_settings_VALAFLAGS = \\\n\t--pkg gtk+-3.0 \\\n\t<b>$(top_srcdir)\/common\/common.vapi<\/b>\n\nbrainbreak_settings_LDADD = \\\n\t$(BRAINBREAK_LIBS) \\\n\t<b>$(top_srcdir)\/common\/libcommon.la<\/b>\n\n<b>brainbreak_settings_vala.stamp: \\\n\t$(top_srcdir)\/common\/libcommon_la_vala.stamp<\/b>\n\njunk_files = \\\n\t$(brainbreak_settings_SOURCES:.vala=.c) \\\n\tbrainbreak_settings_vala.stamp\n\ndist-hook:\n\tcd $(distdir) &amp;&amp; rm -f $(junk_files)\n\nCLEANFILES = \\\n\t$(junk_files)<\/pre>\n\n\n\n<p>Of course, I also rewrote a bunch of stuff which had been thrown together a little too hastily. I knew I would need to rewrite a lot of code, but I wanted to get the &#8220;rewrite and start over&#8221; bug out of my system in the beginning, and I think it worked. Allan Day already came up with <a href=\"https:\/\/github.com\/gnome-design-team\/gnome-mockups\/tree\/master\/break-timer\">some lovely mockups<\/a> that I could start with, so I used those to guide me in choosing what needed work. As I worked through implementing different bits of his &#8220;take a break&#8221; UI, I noticed some aspects that would have been quite difficult with the design I had earlier. I squished and pulled things accordingly, giving the UI code a little more power and knowledge, and getting rid of needlessly arcane kinds of &#8220;reusable&#8221; code. But that&#8217;s all a little boring.<\/p>\n\n\n\n<p>I&#8217;m really excited for the next bit. I will be working on a beautiful new Break Settings application, complete with <a href=\"https:\/\/developer.gnome.org\/gtk3\/3.9\/GtkHeaderBar.html\">GtkHeaderBar<\/a> and (hopefully) a non-ridiculous time input widget. I&#8217;ll post some pictures and a new download soon!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;m starting the third week of coding on my GSoC 2013 project, <a title=\"My GSOC 2013 project: a new break timer application for GNOME\" href=\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/06\/23\/my-gsoc-2013-project-break-timer-for-gnome\/\">a new break timer application<\/a> for GNOME. I spent the last two weeks working on an odd mix of little things. For the most part, my goal over that time was to make the gnome-break-timer project (previously brainbreak, still brainbreak in most places) nicer to work with&hellip; I&#8217;m a bit of a sucker for clean code, and, well&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"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":"","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,"font":"","enabled":false},"version":2}},"categories":[55],"tags":[],"class_list":["post-1382","post","type-post","status-publish","format-standard","hentry","category-gsoc-2013"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>GNOME Break Timer: Week 2 - 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\/2013\/07\/01\/break-timer-gsoc-project-week-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GNOME Break Timer: Week 2 - Dylan McCall\" \/>\n<meta property=\"og:description\" content=\"I&#8217;m starting the third week of coding on my GSoC 2013 project, a new break timer application for GNOME. I spent the last two weeks working on an odd mix of little things. For the most part, my goal over that time was to make the gnome-break-timer project (previously brainbreak, still brainbreak in most places) nicer to work with&hellip; I&#8217;m a bit of a sucker for clean code, and, well&#8230;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Dylan McCall\" \/>\n<meta property=\"article:published_time\" content=\"2013-07-01T17:36:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-12-01T19:26:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.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=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/\"},\"author\":{\"name\":\"Dylan McCall\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5\"},\"headline\":\"GNOME Break Timer: Week 2\",\"datePublished\":\"2013-07-01T17:36:54+00:00\",\"dateModified\":\"2021-12-01T19:26:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/\"},\"wordCount\":631,\"image\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png\",\"articleSection\":[\"GSoC 2013\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/\",\"url\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/\",\"name\":\"GNOME Break Timer: Week 2 - Dylan McCall\",\"isPartOf\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png\",\"datePublished\":\"2013-07-01T17:36:54+00:00\",\"dateModified\":\"2021-12-01T19:26:37+00:00\",\"author\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/#primaryimage\",\"url\":\"https:\/\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png\",\"contentUrl\":\"https:\/\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png\"},{\"@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":"GNOME Break Timer: Week 2 - 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\/2013\/07\/01\/break-timer-gsoc-project-week-2\/","og_locale":"en_US","og_type":"article","og_title":"GNOME Break Timer: Week 2 - Dylan McCall","og_description":"I&#8217;m starting the third week of coding on my GSoC 2013 project, a new break timer application for GNOME. I spent the last two weeks working on an odd mix of little things. For the most part, my goal over that time was to make the gnome-break-timer project (previously brainbreak, still brainbreak in most places) nicer to work with&hellip; I&#8217;m a bit of a sucker for clean code, and, well&#8230;","og_url":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/","og_site_name":"Dylan McCall","article_published_time":"2013-07-01T17:36:54+00:00","article_modified_time":"2021-12-01T19:26:37+00:00","og_image":[{"url":"https:\/\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png","type":"","width":"","height":""}],"author":"Dylan McCall","twitter_misc":{"Written by":"Dylan McCall","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/#article","isPartOf":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/"},"author":{"name":"Dylan McCall","@id":"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5"},"headline":"GNOME Break Timer: Week 2","datePublished":"2013-07-01T17:36:54+00:00","dateModified":"2021-12-01T19:26:37+00:00","mainEntityOfPage":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/"},"wordCount":631,"image":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/#primaryimage"},"thumbnailUrl":"https:\/\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png","articleSection":["GSoC 2013"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/","url":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/","name":"GNOME Break Timer: Week 2 - Dylan McCall","isPartOf":{"@id":"https:\/\/dylanmc.ca\/\/-\/#website"},"primaryImageOfPage":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/#primaryimage"},"image":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/#primaryimage"},"thumbnailUrl":"https:\/\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png","datePublished":"2013-07-01T17:36:54+00:00","dateModified":"2021-12-01T19:26:37+00:00","author":{"@id":"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/01\/break-timer-gsoc-project-week-2\/#primaryimage","url":"https:\/\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png","contentUrl":"https:\/\/dylanmc.ca\/wp-content\/uploads\/The-life-of-a-software-engineer.png"},{"@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":"","jetpack_shortlink":"https:\/\/wp.me\/pcXOQX-mi","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/posts\/1382","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=1382"}],"version-history":[{"count":24,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/posts\/1382\/revisions"}],"predecessor-version":[{"id":11011,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/posts\/1382\/revisions\/11011"}],"wp:attachment":[{"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/media?parent=1382"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/categories?post=1382"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/tags?post=1382"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}