realize.be - On art, music, mobile, drupal, stars, flying things and planets https://realize.be/rss.xml en First stable release of the IndieWeb module for Drupal 8 https://realize.be/blog/first-stable-release-indieweb-module-drupal-8 <p>About a year ago, I only just learned about the principles of <a href="https://indieweb.org/" target="_blank">IndieWeb</a>, which in a way is a bit of a shame. Fast forward to now, and I'm proud to announce the <a href="https://www.drupal.org/project/indieweb/releases/8.x-1.0" target="_blank">first stable</a> release for Drupal 8. Together with this milestone, I also pushed a new version of <a href="https://indigenous.abode.pub/" target="_blank">Indigenous</a> so that both are aligned feature wise.</p> <p>It's been a great journey so far, and while there's still a lot to do for both projects, the stability and feature set warrants a stable tag. It has changed the way I interact with (social) media day to day now since the last half year, both in reading and posting, being in full control of every aspect. It's great, everyone should try it!</p> <h3>What's next?</h3> <p>I've been thinking the last few weeks to raise funding, but after much consideration, I'm not going forward on that path. Even though my <a href="https://github.com/swentel" target="_blank">public GitHub</a> profile lists over 1300 contributions the last year (about 3.5 per day), which somehow is simply crazy, I still have more than enough spirit and motivation to keep on going. Just a little slower from now on, since many features for both projects are not mission critical - even though they are awesome. Of course, I won't mind if someone would suddenly feel the urge to sponsor me.</p> <p>Slowing down now you think, that can't be true ? Right. As already announced a few weeks ago, the next focus will be writing an Activitypub module for Drupal so you can communicate with your site on the Fediverse. I'm currently using <a href="https://realize.be/blog/your-site-fediverse-bridgy-fed">Bridgy Fed</a> for this, but, in the IndieWeb spirit, it's time to bring this home!</p> <p>But first, time to make sure I don't mess up my <a href="https://realize.be/blog/quasi-unutopia-tryouts-first-movement">tryouts</a> of the Moonlight sonata. No commits until after March 31st - I promise :)</p> Thu, 14 Mar 2019 09:48:16 +0100 swentel 1f93fb32-0b05-43f0-8847-bfd692ab36f2 Paid contributing to Drupal https://realize.be/blog/paid-contributing-drupal <p>Starting this year, I have the opportunity to contribute to Drupal and get paid for it. While I've had sponsored time in the past, this time it's recurring: <a href="https://dropsolid.com" target="_blank">Dropsolid</a> is paying me a day a month to work on Drupal core or contrib. 1 day is limited, however, make no mistake, even one day is useful to get into the queue and review issues or commit patches on contrib modules I maintain. And of course, I credit them in the issue queue.</p> <p>The main areas where I will focus on for now are: <ul> <li>Issue queue gardening for Drupal Core (RTBC, NR, Critical)</li> <li>Display Suite maintenance for D8</li> <li>Configuration management issues</li> </ul> Note that I'm looking for areas where I feel comfortable and make sense for the company. For instance, I'm not going to work on IndieWeb during these paid hours - but feel free to contact me if you'd like to have me work on that :) </p> <p>I'd love to have more these days like these, so if other companies are interested in sponsoring me to work on Drupal, <a href="https://realize.be/contact">get in touch</a> and let's talk!</p> <p>For now a big thanks already to <a href="https://dropsolid.com" target="_blank">Dropsolid</a> and see you in the queue!</p> Thu, 31 Jan 2019 12:31:26 +0100 swentel 1bf16907-3d44-46fb-905c-c83c3eb63b40 Send me a webmention with Drupal! https://realize.be/blog/send-me-webmention-drupal <p>After months of reading, experimenting and a lot of coding, I'm happy that the <a href="https://www.drupal.org/project/indieweb/releases/8.x-1.0-rc1" target="_blank">first release candidate</a> of the Drupal IndieWeb module is out. I guess this makes the perfect time to try it out for yourself, no? There are a lot of concepts within the <a href="https://spec.indieweb.org/" target="_blank">IndieWeb</a> universe, and many are supported by the module. In fact, there are 8 submodules, so it might be daunting to start figuring out which ones to enable and what they exactly allow you to do. To kick start anyone interested, I'll explain in a few steps how you can send a <a href="https://indieweb.org/webmention" target="_blank">webmention</a> to this page. Can you mention me?</p> <h3>Step 1: enabling modules</h3> <p>After you downloaded the module and installed the required composer packages, enable following modules: IndieWeb, Webmention and Microformats2. In case you are not authenticated as user 1, also toggle the following permissions: 'Administer IndieWeb configuration' and 'Send webmention'. <h3>Step 2: expose author information</h3> <p>To discover the author of a website after receiving a webmention, your homepage, or the canonical url of a post needs author information. The module comes with an Author block so you can quickly expose a block where you can configure your name. Your real name or nickname is fine, as long as there's something. The minimal markup should look like something like this: <div class="codeblock"><code>&lt;p class=&quot;h-card&quot;&gt;Your &lt;a class=&quot;u-url p-name&quot; rel=&quot;me&quot; href=&quot;https://example.com&quot;&gt;name&lt;/a&gt;&lt;/p&gt;</code></div> <br /> Note: this can be anywhere in your HTML, even hidden. </p> <h3>Step 3: configure webmention module</h3> <p>All configuration exposed by the modules lives under 'Web services' > 'IndieWeb' at /admin/config/services/indieweb. To configure sending webmentions go to /admin/config/services/indieweb/webmention/send. Ignore the ' Syndication targets' fieldset and scroll down to ' Custom URL's for content' and toggle the 'Expose textfield' checkbox.</p> <img src="https://realize.be/sites/default/files/webmention-expose.png" title="Webmention expose textfield configuration" /> <p>Scroll down a bit more and configure how you want to send webmentions, either by cron or drush (webmentions are stored in a queue first for performance reasons)</p> <img src="https://realize.be/sites/default/files/webmention-send.png" title="Webmention configuration" /> <h3>Step 4: configure Microformats module</h3> <p>When sending a webmention to me, it would be nice to be able to figure out what exactly your post is. To achieve this, we need to add markup to the HTML by using CSS classes. Let's configure the minimal markup at /admin/config/services/indieweb/microformats by toggling following checkboxes: <ul> <li>h-entry on node wrappers</li> <li>e-content on standard body fields. In case your node type does not use the standard body field, enter the field name in the 'e-content on other textarea fields' textarea.</li> <li>dt-published, p-name, u-author and u-url in a hidden span element on nodes.</li> </ul> </p> <h3>Now create a post!</h3> <p>Create a post with a title and body. Your body needs to contain a link with a class so that when I receive your webmention, I know that this page is valid. As an example, we're going to write a reply:</p> <div class="codeblock"><code>Hi swentel! I just read your &lt;a href=&quot;https://realize.be/blog/send-me-webmention-drupal&quot; class=&quot;u-in-reply-to&quot;&gt;article&lt;/a&gt; and it&#039;s awesome!</code></div> <p>Save the post and verify the markup more or less looks like underneath. Make sure you see following classes: <strong>h-entry, u-url, p-name, dt-published, e-content, u-author</strong>. <div class="codeblock"><code>&lt;article role=&quot;article&quot; class=&quot;h-entry node node--type-article node--promoted node--unpublished node--view-mode-full clearfix&quot;&gt;<br />&nbsp; &lt;header&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;div class=&quot;node__meta&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Published on &lt;span class=&quot; field--label-hidden&quot;&gt;Tue, 04/12/2018 - 22:39&lt;/span&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/span&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span class=&quot;hidden&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href=&quot;https://example.com/canonical-url&quot; class=&quot;u-url&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span class=&quot;p-name&quot;&gt;Test send!&lt;/span&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span class=&quot;dt-published&quot;&gt;2018-12-04T22:39:57+01:00&lt;/span&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/a&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href=&quot;/&quot; class=&quot;u-author&quot;&gt;&lt;/a&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/span&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/header&gt;<br />&nbsp; &lt;div class=&quot;node__content clearfix&quot;&gt;<br />&nbsp; &lt;div class=&quot;e-content clearfix &quot;&gt;Hi swentel! I just read your &lt;a href=&quot;https://realize.be/blog/send-me-webmention-drupal&quot; class=&quot;u-in-reply-to&quot;&gt;article&lt;/a&gt; and it&#039;s awesome!&lt;/div&gt;<br />&nbsp; &lt;/div&gt;<br />&lt;/article&gt;</code></div> <p>If everything looks fine, go to the node form again. Open the 'Publish to' fieldset where you can enter '<a href="https://realize.be/blog/send-me-webmention-drupal">https://realize.be/blog/send-me-webmention-drupal</a>' in the custom URL textfield. Save again and check the send list at /admin/content/webmention/send-list. It should tell that there is one item in the queue. As a final step, run cron or the 'indieweb-send-webmentions' drush command. After that the queue should be empty and one entry will be in the send list and I should have received your webmention!</p> <p>Note: You can vary between the 'u-in-reply-to', 'u-like-of' or 'u-repost-of' class. Basically, the class determines your <a href="https://indieweb.org/responses" target="_blank">response</a> type. The first class will create a comment on this post. The other two classes will be a mention in the sidebar.</p> <h3>What's next?</h3> <p>Well, a lot of course. But the next step should be receiving webmentions no? If you go to /admin/config/services/indieweb/webmention, you can enable receiving webmentions by using the built-in endpoint. Make sure you expose the link tag so I know where to mention you!</p> <h3>I tried it, and it didn't work!</h3> <p>Maybe I missed something in the tutorial. Or you have found a bug :) Feel free to ping me on irc.freenode.net on #indieweb-dev or #drupal-contribute. You may also open an issue at <a href="https://github.com/swentel/indieweb">https://github.com/swentel/indieweb</a></p> Wed, 05 Dec 2018 12:07:29 +0100 swentel d4694814-b3ec-4bea-958a-c687fba2579a Your site on the fediverse with Bridgy Fed https://realize.be/blog/your-site-fediverse-bridgy-fed <p><img src="https://realize.be/sites/default/files/2018-10/swentel-search-fediverse.png" title="Search on Mastodon" align="right" style="margin-left: 10px; margin-bottom: 10px;">Lately, <a href="https://mastodon.social" target="_blank">Mastodon</a> is getting a lot of attention as an alternative for <a href="https://twitter.com" target="_blank">Twitter</a>. It's a microblogging platform which allows you to setup your own instance, and still interact with users on a totally different domain. They are all part of the <a href="https://en.wikipedia.org/wiki/Fediverse" target="_blank">Fediverse</a>. It uses open standard protocols and specifications as much as possible, which means that integration from other places should be possible, e.g. why not <em>your own site</em> !</p> <h3>Webmentions</h3> <p>To interact with Mastodon, and most other federated platforms, you need to implement Activitypub and add Webfinger support to your domain, which can be tricky to setup. Enter <a href="https://fed.brid.gy/" target="_blank">Bridgy Fed</a>: it acts as a proxy for your domain and does all the heavy lifting for discovery, sending posts to the right instance and sending back interactions to your site. The <a href="https://www.drupal.org/project/indieweb" target="_blank">Drupal IndieWeb</a> module has all the necessary tools for sending and receiving webmentions and the markup needed for your content. In fact, there are only two simple things you need to do. Add "Fediverse|https://fed.brid.gy/" on the 'Sending' settings screen as a syndication target and two lines to .htaccess, and you're done: welcome to the Fediverse. Don't like Drupal ? No problem! Any framework, whether you are using Wordpress or Known, or even wrote yourself, which supports sending webmentions can get on the Fediverse! Read about <a href="https://indieweb.org/Webmention" target="_blank">webmentions</a> and <a href="https://indieweb.org/microformats" target="_blank">microformats</a> on IndieWeb.org.</p> <h3>Following</h3> <p>If you are on Mastodon, you can follow me by searching for 'swentel' which will give you two results. One is a test account I use for testing the AP protocol. The user that is managed by Bridgy Fed, and which will now get all the notes I syndicate from my site, is @realize.be@realize.be.</p> <p>Since I don't have an actual account, how do I follow users? Mastodon exposes an atom and even a Microformats feed of every user. This allows everyone to follow accounts with even a simple RSS reader. In my case, I use <a href="https://indigenous.abode.pub/" target="_blank">Indigenous</a> as my reader, and <a href="https://aperture.p3k.io/" target="_blank">Aperture</a> as the server (actually, I'm using the built-in server now in the IndieWeb module, but Aperture is a great alternative to get started!). From my client, I can directly interact with anyone on the Fediverse because it knows my <a href="https://indieweb.org/Micropub" target="_blank">micropub</a> endpoint to post to my site which then starts syndicating posts to the right instance: replying, liking, boosting, posting .. it all works! Some tiny details need to be figured out still, like images, but simple content just works fine! <p>All of this has been tested with Mastodon. There are more federated platforms out there, so this is only the beginning! A big shout out to <a href="https://snarfed.org/" target="_blank">Ryan Barret</a>, the maintainer of Bridgy Fed (and many other great tools)!</p> Tue, 20 Nov 2018 20:34:42 +0100 swentel c0d9e7c1-7dc1-4340-8c92-9a7bbd56b959 Quasi un'Utopia : tryouts first movement https://realize.be/blog/quasi-unutopia-tryouts-first-movement <p>It's official: I'm not going to perform the complete Moonlight Sonata <a href="https://realize.be/blog/quasi-unutopia-very-beginning">this year</a>. I'm not giving up the dream though, it will just take a <em>little</em> longer. The main reason for the delay is simply time, so I need to come up with a plan to make sure I have more time next year to study the entire piece. Hopefully, more on that later.</p> <p>However! You can mark March 30/31 2019 in your agenda as I'm going to perform the first movement of the piece during a choir concert. A small teaser, and probably already stressful enough, but I'll learn a lot by getting on stage and controlling my nerves, and fingers before a fairly big crowd - last year, around 300 people attended.</p> <p>I'll keep posting video updates too as it's fun creating them, so expect some new ones coming soon!</p> Fri, 14 Sep 2018 23:17:40 +0200 swentel 2c47a542-d52f-4d4f-86bc-f8abebaf12ce Exclude entities which have a redirect from the search api index https://realize.be/blog/exclude-entities-which-have-redirect-search-api-index <p>For a custom project, we use a taxonomy to tag nodes. Some terms have their own page, while others redirect to a node. The search on the site has one index which contains both nodes and terms, but the terms which are redirecting shouldn't show up when viewing a search results page. While it's possible to use hook_search_api_index_items_alter(), a nicer way to exclude them is by using a processor plugin so you can enable them in the UI per index. The relevant code is underneath. Adjust to your own likings - and maybe inject the service if you want to as well :)</p> <div class="codeblock"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">Drupal</span><span style="color: #007700">\</span><span style="color: #0000BB">project</span><span style="color: #007700">\</span><span style="color: #0000BB">Plugin</span><span style="color: #007700">\</span><span style="color: #0000BB">search_api</span><span style="color: #007700">\</span><span style="color: #0000BB">processor</span><span style="color: #007700">;<br /><br />use </span><span style="color: #0000BB">Drupal</span><span style="color: #007700">\</span><span style="color: #0000BB">search_api</span><span style="color: #007700">\</span><span style="color: #0000BB">IndexInterface</span><span style="color: #007700">;<br />use </span><span style="color: #0000BB">Drupal</span><span style="color: #007700">\</span><span style="color: #0000BB">search_api</span><span style="color: #007700">\</span><span style="color: #0000BB">Processor</span><span style="color: #007700">\</span><span style="color: #0000BB">ProcessorPluginBase</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">/**<br />&nbsp;* Excludes entities which have a redirect.<br />&nbsp;*<br />&nbsp;* @SearchApiProcessor(<br />&nbsp;*&nbsp;&nbsp; id = "entity_redirect",<br />&nbsp;*&nbsp;&nbsp; label = @Translation("Entity redirect"),<br />&nbsp;*&nbsp;&nbsp; description = @Translation("Exclude entities which have a redirect from being indexed."),<br />&nbsp;*&nbsp;&nbsp; stages = {<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; "alter_items" = 0,<br />&nbsp;*&nbsp;&nbsp; },<br />&nbsp;* )<br />&nbsp;*/<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">EntityRedirect </span><span style="color: #007700">extends </span><span style="color: #0000BB">ProcessorPluginBase </span><span style="color: #007700">{<br /><br />&nbsp; </span><span style="color: #FF8000">/**<br />&nbsp;&nbsp; * {@inheritdoc}<br />&nbsp;&nbsp; */<br />&nbsp; </span><span style="color: #007700">public static function </span><span style="color: #0000BB">supportsIndex</span><span style="color: #007700">(</span><span style="color: #0000BB">IndexInterface $index</span><span style="color: #007700">) {<br />&nbsp;&nbsp;&nbsp; foreach (</span><span style="color: #0000BB">$index</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getDatasources</span><span style="color: #007700">() as </span><span style="color: #0000BB">$datasource</span><span style="color: #007700">) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000BB">$entity_type_id </span><span style="color: #007700">= </span><span style="color: #0000BB">$datasource</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getEntityTypeId</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!</span><span style="color: #0000BB">$entity_type_id</span><span style="color: #007700">) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (</span><span style="color: #0000BB">$entity_type_id </span><span style="color: #007700">=== </span><span style="color: #DD0000">'node' </span><span style="color: #007700">|| </span><span style="color: #0000BB">$entity_type_id </span><span style="color: #007700">== </span><span style="color: #DD0000">'taxonomy_term'</span><span style="color: #007700">) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return </span><span style="color: #0000BB">TRUE</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">;<br />&nbsp; }<br /><br />&nbsp; </span><span style="color: #FF8000">/**<br />&nbsp;&nbsp; * {@inheritdoc}<br />&nbsp;&nbsp; */<br />&nbsp; </span><span style="color: #007700">public function </span><span style="color: #0000BB">alterIndexedItems</span><span style="color: #007700">(array &amp;</span><span style="color: #0000BB">$items</span><span style="color: #007700">) {<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000BB">$repository </span><span style="color: #007700">= \</span><span style="color: #0000BB">Drupal</span><span style="color: #007700">::</span><span style="color: #0000BB">service</span><span style="color: #007700">(</span><span style="color: #DD0000">'redirect.repository'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000BB">$pathAliasmanager </span><span style="color: #007700">= \</span><span style="color: #0000BB">Drupal</span><span style="color: #007700">::</span><span style="color: #0000BB">service</span><span style="color: #007700">(</span><span style="color: #DD0000">'path.alias_manager'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #FF8000">/** @var \Drupal\search_api\Item\ItemInterface $item */<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #007700">foreach (</span><span style="color: #0000BB">$items </span><span style="color: #007700">as </span><span style="color: #0000BB">$item_id </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$item</span><span style="color: #007700">) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000BB">$object </span><span style="color: #007700">= </span><span style="color: #0000BB">$item</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getOriginalObject</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">getValue</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000BB">$path </span><span style="color: #007700">= </span><span style="color: #0000BB">$object</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">toUrl</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">toString</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000BB">$path </span><span style="color: #007700">= </span><span style="color: #0000BB">$pathAliasmanager</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getPathByAlias</span><span style="color: #007700">(</span><span style="color: #0000BB">$path</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000BB">$path </span><span style="color: #007700">= </span><span style="color: #0000BB">ltrim</span><span style="color: #007700">(</span><span style="color: #0000BB">$path</span><span style="color: #007700">, </span><span style="color: #DD0000">'/'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000BB">$redirect </span><span style="color: #007700">= </span><span style="color: #0000BB">$repository</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">findMatchingRedirect</span><span style="color: #007700">(</span><span style="color: #0000BB">$path</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!empty(</span><span style="color: #0000BB">$redirect</span><span style="color: #007700">)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unset(</span><span style="color: #0000BB">$items</span><span style="color: #007700">[</span><span style="color: #0000BB">$item_id</span><span style="color: #007700">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (\</span><span style="color: #0000BB">Exception $ignored</span><span style="color: #007700">) {}<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }<br /><br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div> Mon, 03 Sep 2018 14:27:10 +0200 swentel f0570e12-dfaa-409d-853e-fe69a53198cd Indigenous for Android https://realize.be/blog/indigenous-android <p>Over the last few weeks, I've been working on a <a href="https://www.drupal.org/project/indieweb" target="_blank">Drupal module for IndieWeb</a> and <a href="https://github.com/swentel/indigenous-android" target="_blank">Indigenous</a>, an Android application which supports <a href="https://indieweb.org/Micropub" target="_blank">micropub</a> and <a href="https://indieweb.org/Microsub" target="_blank">microsub</a>. I'm using it already to post notes, images and even awesome geocaches to my site, often syndicating them to Twitter. Progress on the app heavily depends on how fast I can add features to the Drupal module, but it's going faster than I expected, which is good as it's all very exciting! There is of course the time aspect, but I'm not complaining, yet - although I'm still figuring out if I can setup some funding for both projects, so ideas are welcome!</p> <p>You can now download the app from <a href="https://play.google.com/store/apps/details?id=com.indieweb.indigenous" target="_blank">Google Play</a>. If you want to install it manually, you can also go over to the <a href="https://github.com/swentel/indigenous-android/releases">release</a> section on GitHub. Use GitHub to post issues, ideas, documentation, nicer icons, design mockups ... everyone can help out!</p> <p>Features available, with many more to come:</p> <ul> <li>Sign in with IndieAuth and discover the authorization, token, microsub and micropub endpoints. The <strong>microsub endpoint is optional</strong>, so you can simply use the app for posting only. Multiple accounts are supported.</li> <li>Posts: note, article, like, reply, repost, bookmark, event and RSVP. Add tags and an image, and share your location</li> <li>Syndication: syndicate to your favorite social channel or to the reply/like/repost URL.</li> <li>Microsub: list channels and read all posts per channel. You can directly reply, like or repost per post. Long articles have a 'Read more' button and images can be viewed in fullscreen. Oh, and audio can be listened to directly, so that makes Indigenous a podcast app too!</li> <li>Sharing: Indigenous can accept images or text from other apps. Share an image on your site, or reply to a URL in no time.</li> </ul> Thanks to everyone already for the feedback, and especially <a href="https://aaronparecki.com" target="_blank">Aaron Parecki</a> for letting me use Aperture to test the microsub part and <a href="https://eddiehinkle.com" target="_blank">Eddie Hinkle</a>, the maintainer of <a href="https://github.com/EdwardHinkle/indigenous-ios" target="_blank">Indigenous for iOS</a>. Wed, 11 Apr 2018 14:57:10 +0200 swentel 2419b5a7-9634-4e35-97d7-edaf52d7bfd3 Quasi un'Utopia : little steps https://realize.be/blog/quasi-unutopia-little-steps <p>It's been little over a month now since I've started playing on the piano, reading notes, studying easy tunes and I have to say: it's big fun! Can I play the <a href="https://realize.be/blog/quasi-unutopia-very-beginning">Moonlight sonata</a> already ? Of course not, but I have still 8 and a half months to go, so no stress. As I explained in the first post, I will try and share my progress every month, so this clip is already a bit longer. And it features me, actually playing. I won't tell you the number of takes before I had one without mistakes :)</p> <p>The next month will be interesting as I'm on the road for 3 weeks around Scotland, but I prepared myself: <a href="https://realize.be/image/roll-piano">a roll up piano!</a>. I'm carrying a set of headphones along too as I don't want to annoy my travelling companions too much when it's raining every day - fingers crossed it won't.</p> <p class="youtube"><iframe width="560" height="315" src="https://www.youtube.com/embed/bgHVQASlc70" frameborder="0" allowfullscreen></iframe></p> Fri, 16 Mar 2018 17:36:13 +0100 swentel 69ab9278-7221-4fca-b611-5ecef66dae47 Webmention.io integration for Drupal 8 https://realize.be/blog/webmentionio-integration-drupal-8 <p>I've had my site for quite some time now, the internet archive goes way back to 2002 even! To be fair, most of the content until 2007 wasn't that interesting (not sure what makes me think it is nowadays though, but okay ... ), but it was mostly the primary source of well .. me :). Apart from that, I also use Twitter, but I want to turn this around and let my site be the primary source. The <a href="https://indieweb.org/why" target="_blank">IndieWeb</a> movement is something I only recently discovered, but somehow, the philosophy was in my mind for the last few weeks, and I am not the only one that is talking about it.</p> <p>So, as a first small step, to figure out who links to my content, I created a simple Drupal 8 module that can receive and store webmentions and pingbacks from <a target="_blank" href="https://webmention.io/">Webmention.io</a>. The source is available at <a href="https://github.com/swentel/webmention_io" target="_blank">https://github.com/swentel/webmention_io</a>. I'll move this drupal.org at some point once it gets into a more polished state, but it also depends on further iterations of getting more interaction feedback to my site.</p> <p><strong>Update:</strong> The repository has already moved to <a href="https://github.com/swentel/indieweb">https://github.com/swentel/indieweb</a> - sorry in case you were using it already :) The module allows you to receive webmentions, send webmentions to brid.gy which will look for the microformats added by the module on content and images. Micropub and Microsub are on the way too!</p> <p><a href="https://brid.gy/" target="_blank">https://brid.gy/</a> is polling Twitter and forwarding those mentions to this site, and currently likes are being exposed and replies are stored as comments, which is very cool! See the sweet magic happening right <a href="https://realize.be/notes/1225">on note #4</a>.</p> Tue, 27 Feb 2018 20:10:26 +0100 swentel f651c78c-1d94-4d61-be05-8e1774ffe3b1 Quasi un'Utopia : the very beginning https://realize.be/blog/quasi-unutopia-very-beginning <p>I like personal challenges. For 2018 my main goal is being able to play <a href="https://www.youtube.com/watch?v=q5OaSju0qNc" target="_blank">Piano Sonata No. 14</a> (aka Quasi una fantasia or Moonlight Sonata) by Beethoven. To make it even more stressful, <strong>december 8</strong> has been set as tentative date where I will perform the piece in public, a bet I made with my father in law. Place to be is a <a href="https://nl.wikipedia.org/wiki/Onze-Lieve-Vrouwekerk_(Zevergem)" target="_blank">small church</a> in Zevergem, Belgium, which has great acoustics. Don't put this in your agenda yet as I will make the final decision on september the first. If I don't feel confident enough that I will make it, there won't be a public performance, at least this year :)</p> <p>It's a huge shot in the dark, given my limited (read, practically nonexistent) skills on the piano at this moment. I made a rough schedule with monthly goals which, currently, seem very doable. The first (and quite important) goal has been achieved: actually owning a decent piano at home. To make it a bit more fun for myself, I'm going to post monthly video updates. It will keep me focused as there's some pressure now since I made this public, which I doubted doing at first. So without further ado, here's the intro video. A special thank you to <a href="https://twitter.com/plach__" target="_blank">@plach__</a> for suggesting me the working title of this challenge: <em>Quasi un'Utopia</em>.</p> <p class="youtube"><iframe width="560" height="315" src="https://www.youtube.com/embed/4eaKVj_OIEk" frameborder="0" allowfullscreen></iframe></p> Sat, 17 Feb 2018 11:37:18 +0100 swentel d01690b8-8a10-4ec3-94bf-d6547b928a02