{"id":950,"date":"2012-06-12T15:43:00","date_gmt":"2012-06-12T07:43:00","guid":{"rendered":"http:\/\/gergely.imreh.net\/blog\/?p=950"},"modified":"2012-06-12T15:43:05","modified_gmt":"2012-06-12T07:43:05","slug":"frindcare-some-improvements","status":"publish","type":"post","link":"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/","title":{"rendered":"Frindcare, some improvements"},"content":{"rendered":"<p>After <a title=\"Friendcare, satisfying a curiosity\" href=\"http:\/\/gergely.imreh.net\/blog\/2012\/06\/friendcare-satisfying-a-curiosity\/\" target=\"_blank\">getting to a working level<\/a> with <a title=\"Friendcare\" href=\"https:\/\/friendcare.herokuapp.com\" target=\"_blank\">Friendcare<\/a>, my web app to track friending and defriending on Facebook, I was still doing some tweaks. Some of the tweaks is to improve functionality, some of them to fix some broken behaviour by the services I use (especially Facebook). This is a little summary of what I have learned in this short time.<\/p>\n<h2>Changes<\/h2>\n<h3>Heroku<\/h3>\n<p>The very day of my last blogpost, when I actually had others sign up as well, <a title=\"Heroku home\" href=\"http:\/\/heroku.com\" target=\"_blank\">Heroku<\/a> had a few hour long outage. That was quite unfortunate, and it was annoying to see the &#8220;Application Error&#8221; page, which pretty much hides what really happened. In real production environment probably I would have to run things on multiple independent platforms so if the platform itself is the one that crashes, the site could be just switched over. This time I&#8217;m just taking it simple, make a personalized maintenance page, which I can turn on in this case, or when I&#8217;ll really need some maintenance time. Also, played around Google Web Fonts, so can have the good old school <a title=\"Press Start 2P on Google Webfonts\" href=\"http:\/\/www.google.com\/webfonts\/specimen\/Press+Start+2P\" target=\"_blank\">Press Start 2P<\/a> on this one.<\/p>\n<figure id=\"attachment_954\" aria-describedby=\"caption-attachment-954\" style=\"width: 500px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/friendcaremaintenance-2\/\" rel=\"attachment wp-att-954\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-954\" title=\"Friendcare Maintenance\" src=\"http:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2012\/06\/FriendCareMaintenance1.jpg\" alt=\"Friendcare is offline for maintenance\" width=\"500\" height=\"544\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2012\/06\/FriendCareMaintenance1.jpg 500w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2012\/06\/FriendCareMaintenance1-460x500.jpg 460w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><figcaption id=\"caption-attachment-954\" class=\"wp-caption-text\">Friendcare maintenance screen<\/figcaption><\/figure>\n<p>It would be nice if in case of trouble I could use a web interface to trigger maintenance mode. Might build a service for that, though now that I think of it, that will have to be hosted outside of Heroku. Also, later might do an application error page as well, just in case. Might even choose a mascot for that. Though probably not.<\/p>\n<h3>Fonts<\/h3>\n<p>Besides the error page, I was playing around with other fonts for the main interface as well. In the end the current one is <a title=\"Crimson Text on Google Webfonts\" href=\"http:\/\/www.google.com\/webfonts\/specimen\/Crimson+Text\" target=\"_blank\">Crimson Text<\/a>, which should be quite readable even with very different font size. It is mostly good, though it doesn&#8217;t play completely well with <a title=\"Twitter Bootstrap home\" href=\"http:\/\/twitter.github.com\/bootstrap\/\" target=\"_blank\">Twitter Bootstrap<\/a>, the button texts for example are not totally well aligned vertically. Might have to look around the fonts a little bit more.<\/p>\n<figure id=\"attachment_957\" aria-describedby=\"caption-attachment-957\" style=\"width: 500px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/friendcareheader\/\" rel=\"attachment wp-att-957\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-957\" title=\"Friendcare header 2\" src=\"http:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2012\/06\/FriendcareHeader.jpg\" alt=\"Friendcare header layout\" width=\"500\" height=\"153\" \/><\/a><figcaption id=\"caption-attachment-957\" class=\"wp-caption-text\">Tweaked layout, and it actually already has results<\/figcaption><\/figure>\n<h3>Facebook<\/h3>\n<p>Facebook has so many weird things going on, that I can barely wrap my head around it. One of my impression, which probably shouldn&#8217;t surprise me, that they are most likely not using their own APIs, otherwise it wouldn&#8217;t have such huge bugs in it. Another impression is, that somehow they manage make everything almost good, but in some way completely bad.<\/p>\n<h4>Graph API reliability<\/h4>\n<p>Since the entire site relies on regularly polling the user&#8217;s friend list, getting that list consistently is a must. Somehow the Graph API occasionally misses some friends: they don&#8217;t appear in the list and I mistakenly assume as lost connections. An hour later, when polling again they are back in the list, so they show up as friendship gain. That doesn&#8217;t work very well. This happens a lot, so I had some\u00a0algorithms\u00a0in place for that and sometimes had to manually clean up the database (which I really shouldn&#8217;t do if it can be avoided).<\/p>\n<h4>FQL<\/h4>\n<p>I can also use the <a title=\"Facebook Query Language\" href=\"https:\/\/developers.facebook.com\/docs\/reference\/fql\/\" target=\"_blank\">Facebook Query Language<\/a> to get the information I want. It is quite straightforward, they even have the expression among their examples:<\/p>\n<pre lang=\"SQL\">SELECT uid2 FROM friend WHERE uid1=me()<\/pre>\n<p>This is pretty fast as well, maybe half the time of the Graph API request. There&#8217;s one problem, though: it returns wrong results. Not entirely wrong, just wrong enough. The list I receive seem to have a bunch of invalid user IDs, such that it doesn&#8217;t belong to anyone. They just don&#8217;t exists, but I still receive them. So while Graph API suffered from false negatives, FQL suffers from false positives. Fortunately there seems to be a workaround, in the form of a deeper query such that<\/p>\n<pre lang=\"SQL\">SELECT name, uid FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1=me())<\/pre>\n<p>Here I will actually throw away the &#8216;name&#8217; part, but at least I know that the IDs that I receive do belong to actual people. So far this seems to be the most reliable, though it takes as much time as the Graph API request, or maybe a bit more.<\/p>\n<p>In the end, currently I query both the Graph and FQL in sequence, compare the results, note if they differ (for debugging purposes) and use the FQL result since that seems to be more reliable. Will check back later to this part, when I have more information to go on.<\/p>\n<h4>Offline access<\/h4>\n<p>Offline access is pretty important for this kind of service, because it&#8217;s not that useful if we can only check the results when the user comes to the page. Unfortunately, the &#8216;offline_access&#8217; permission has <a title=\"Offline access permission removed\" href=\"https:\/\/developers.facebook.com\/roadmap\/offline-access-removal\/\" target=\"_blank\">just been removed<\/a>. Instead the access token lives for 60 days, after which one has to get a new one by logging the user in again. I&#8217;m not saying it&#8217;s unreasonable, maybe even better since I don&#8217;t have to ask for any extended permission over the ones that are granted to every app automatically, but have to keep in mind. It might complicate things. Also reminds me that other apps that I&#8217;m using with Facebook (e.g. <a title=\"If This Than That\" href=\"http:\/\/ifttt.com\/\" target=\"_blank\">ifttt<\/a>) will have some problem because of this thus I will have problem with this. Better check with them.<\/p>\n<h4>Send message prompt dialog<\/h4>\n<p>I kinda understood when they have removed the ability to send message to others on the user&#8217;s behalf without their interaction, that&#8217;s such a tempting spam delivery system for most, I presume. On the other hand, for a long time at least they had (or I seem to remember they had) a send dialog, where I could prompt a user to send a message to someone else: they write the actual message and they click send. On the other hand, the current <a title=\"Send Dialog on Facebook docs\" href=\"https:\/\/developers.facebook.com\/docs\/reference\/dialogs\/send\/\" target=\"_blank\">Send Dialog<\/a> has a required parameter &#8216;link&#8217;, this it is no longer possible to send &#8220;just a message&#8221;. This must be a relatively new chance, since the dialog&#8217;s page describes it as:<\/p>\n<blockquote><p>The Send Dialog lets people to send content to specific friends.<\/p><\/blockquote>\n<p>Fair enough, that&#8217;s exactly how does it work. On the other hand, just one level up, the <a title=\"Dialogs Overview on Facebook docs\" href=\"https:\/\/developers.facebook.com\/docs\/reference\/dialogs\/\" target=\"_blank\">Dialogs Overview<\/a> says this:<\/p>\n<blockquote><p>The\u00a0Send Dialog\u00a0allows a user to send a Facebook Message to one or more of their friends.<\/p><\/blockquote>\n<p>Content vs. message, subtle but\u00a0crucial\u00a0difference. Thus in my app I cannot have a &#8220;send message to this user&#8221; button, unless I attach some kind of link to the message. Now this feels really spammy to me.<\/p>\n<h2>Overall<\/h2>\n<p>It is good to add a few more features, because I can use it better as well, and I learned a lot too. Might add a proper dashboard, a deregister option, notification to email or (if I can figure out how) Facebook message, stats, better layout. Or whatever suggestion I receive.<\/p>\n<p>Finally, the most important thing that it works. In the last week I found two people who defriended me for whatever reason, and I wouldn&#8217;t have known about otherwise. They were not close ones, so not going to pursue them, but it could have been otherwise, so at least it&#8217;s good to know.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>After using for about a week, I tried to improve on the functionality of my web app that tracks my connections on Facebook. Some lessons learned, some ranting is still necessary.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[13,62,63],"class_list":["post-950","post","type-post","status-publish","format-standard","hentry","category-prog","tag-facebook","tag-heroku","tag-nodejs"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Frindcare, some improvements - ClickedyClick<\/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:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Frindcare, some improvements - ClickedyClick\" \/>\n<meta property=\"og:description\" content=\"After using for about a week, I tried to improve on the functionality of my web app that tracks my connections on Facebook. Some lessons learned, some ranting is still necessary.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/\" \/>\n<meta property=\"og:site_name\" content=\"ClickedyClick\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/gergely.imreh\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/gergely.imreh\" \/>\n<meta property=\"article:published_time\" content=\"2012-06-12T07:43:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-06-12T07:43:05+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2012\/06\/FriendCareMaintenance1.jpg\" \/>\n<meta name=\"author\" content=\"Gergely Imreh\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@imrehg\" \/>\n<meta name=\"twitter:site\" content=\"@imrehg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gergely Imreh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2012\\\/06\\\/frindcare-some-improvements\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2012\\\/06\\\/frindcare-some-improvements\\\/\"},\"author\":{\"name\":\"Gergely Imreh\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\"},\"headline\":\"Frindcare, some improvements\",\"datePublished\":\"2012-06-12T07:43:00+00:00\",\"dateModified\":\"2012-06-12T07:43:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2012\\\/06\\\/frindcare-some-improvements\\\/\"},\"wordCount\":1195,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\"},\"image\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2012\\\/06\\\/frindcare-some-improvements\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2012\\\/06\\\/FriendCareMaintenance1.jpg\",\"keywords\":[\"facebook\",\"heroku\",\"nodejs\"],\"articleSection\":[\"Programming\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2012\\\/06\\\/frindcare-some-improvements\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2012\\\/06\\\/frindcare-some-improvements\\\/\",\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2012\\\/06\\\/frindcare-some-improvements\\\/\",\"name\":\"Frindcare, some improvements - ClickedyClick\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2012\\\/06\\\/frindcare-some-improvements\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2012\\\/06\\\/frindcare-some-improvements\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2012\\\/06\\\/FriendCareMaintenance1.jpg\",\"datePublished\":\"2012-06-12T07:43:00+00:00\",\"dateModified\":\"2012-06-12T07:43:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2012\\\/06\\\/frindcare-some-improvements\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2012\\\/06\\\/frindcare-some-improvements\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2012\\\/06\\\/frindcare-some-improvements\\\/#primaryimage\",\"url\":\"http:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2012\\\/06\\\/FriendCareMaintenance1.jpg\",\"contentUrl\":\"http:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2012\\\/06\\\/FriendCareMaintenance1.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2012\\\/06\\\/frindcare-some-improvements\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Frindcare, some improvements\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/\",\"name\":\"ClickedyClick\",\"description\":\"Life in real, complex and digital.\",\"publisher\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\",\"name\":\"Gergely Imreh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\",\"caption\":\"Gergely Imreh\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\"},\"description\":\"Physicist, hacker. Enjoys avant-guarde literature probably a bit too much. Open source advocate and contributor, both for software and hardware. Follow these posts on the Fediverse by @gergely@gergely.imreh.net\",\"sameAs\":[\"https:\\\/\\\/gergely.imreh.net\\\/\",\"https:\\\/\\\/www.facebook.com\\\/gergely.imreh\",\"https:\\\/\\\/www.instagram.com\\\/imrehg\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/gergelyimreh\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@GergelyImreh\"],\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/author\\\/gergely\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Frindcare, some improvements - ClickedyClick","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:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/","og_locale":"en_GB","og_type":"article","og_title":"Frindcare, some improvements - ClickedyClick","og_description":"After using for about a week, I tried to improve on the functionality of my web app that tracks my connections on Facebook. Some lessons learned, some ranting is still necessary.","og_url":"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/","og_site_name":"ClickedyClick","article_publisher":"https:\/\/www.facebook.com\/gergely.imreh","article_author":"https:\/\/www.facebook.com\/gergely.imreh","article_published_time":"2012-06-12T07:43:00+00:00","article_modified_time":"2012-06-12T07:43:05+00:00","og_image":[{"url":"http:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2012\/06\/FriendCareMaintenance1.jpg","type":"","width":"","height":""}],"author":"Gergely Imreh","twitter_card":"summary_large_image","twitter_creator":"@imrehg","twitter_site":"@imrehg","twitter_misc":{"Written by":"Gergely Imreh","Estimated reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/#article","isPartOf":{"@id":"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/"},"author":{"name":"Gergely Imreh","@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0"},"headline":"Frindcare, some improvements","datePublished":"2012-06-12T07:43:00+00:00","dateModified":"2012-06-12T07:43:05+00:00","mainEntityOfPage":{"@id":"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/"},"wordCount":1195,"commentCount":1,"publisher":{"@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0"},"image":{"@id":"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/#primaryimage"},"thumbnailUrl":"http:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2012\/06\/FriendCareMaintenance1.jpg","keywords":["facebook","heroku","nodejs"],"articleSection":["Programming"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/","url":"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/","name":"Frindcare, some improvements - ClickedyClick","isPartOf":{"@id":"https:\/\/gergely.imreh.net\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/#primaryimage"},"image":{"@id":"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/#primaryimage"},"thumbnailUrl":"http:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2012\/06\/FriendCareMaintenance1.jpg","datePublished":"2012-06-12T07:43:00+00:00","dateModified":"2012-06-12T07:43:05+00:00","breadcrumb":{"@id":"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/#primaryimage","url":"http:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2012\/06\/FriendCareMaintenance1.jpg","contentUrl":"http:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2012\/06\/FriendCareMaintenance1.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/gergely.imreh.net\/blog\/2012\/06\/frindcare-some-improvements\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gergely.imreh.net\/blog\/"},{"@type":"ListItem","position":2,"name":"Frindcare, some improvements"}]},{"@type":"WebSite","@id":"https:\/\/gergely.imreh.net\/blog\/#website","url":"https:\/\/gergely.imreh.net\/blog\/","name":"ClickedyClick","description":"Life in real, complex and digital.","publisher":{"@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gergely.imreh.net\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0","name":"Gergely Imreh","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g","caption":"Gergely Imreh"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g"},"description":"Physicist, hacker. Enjoys avant-guarde literature probably a bit too much. Open source advocate and contributor, both for software and hardware. Follow these posts on the Fediverse by @gergely@gergely.imreh.net","sameAs":["https:\/\/gergely.imreh.net\/","https:\/\/www.facebook.com\/gergely.imreh","https:\/\/www.instagram.com\/imrehg\/","https:\/\/www.linkedin.com\/in\/gergelyimreh\/","https:\/\/www.youtube.com\/@GergelyImreh"],"url":"https:\/\/gergely.imreh.net\/blog\/author\/gergely\/"}]}},"_links":{"self":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts\/950","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/comments?post=950"}],"version-history":[{"count":44,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts\/950\/revisions"}],"predecessor-version":[{"id":997,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts\/950\/revisions\/997"}],"wp:attachment":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/media?parent=950"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/categories?post=950"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/tags?post=950"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}