Log in
Seblog.nl

English posts

Switching to ZNC on my Raspberry Pi

I’ve been following the #indieweb channel on IRC for a while now, sometimes more active than other times, and my several methods. In the beginning, I just read the logs on chat.indieweb.org, but when I wanted to say something I had to login with Textual.

Back in Amsterdam I had a bad internet connection (they probably tried to block IRC) so I wasn’t using it a lot. Then there was the bridged Slack channel, which I used intil my first HWC, where Martijn introduced me to thelounge. I installed it on a Raspberry Pi I had lying around and used that for quite a while, until I became inactive and shut the thing down.

Unfortunately I haven’t been able to make it work again after that, so I was in need of something else. Meanwhile I got used to Textual again, and I kind of liked that, except that it disconnected every time my laptop went to sleep.

Ok, so, ZNC you said?

Yeah, enough history! Let’s get to it. ZNC is an IRC bouncer, which connects to IRC for you. When you connect to ZNC, ZNC will give you all the messages it received since you where away. So accedentally closing your laptop? No worries, just open it and you receive all messages again.

You still need some computer to be online all the time, but I had that same Raspberry Pi (first edition model B), and it’s perfect for this job.

I first followed the installation instructions here, first downloading the latest source tarball, and following the unpacking and configuring described on that page. Later on, I had to use a different flag on configure, so I added that one here for you. I used the following commands in order:

wget https://znc.in/releases/znc-1.6.5.tar.gz
tar -xzvf znc-1.6.5.tar.gz
cd znc-1.6.5
./configure --enable-python
make
sudo make install

This all takes a while, especially the make part.

I then made sure I opened a port on my router towards my RPi, so I could access it from outside my home-network, when I’m on the go (look for the NAT settings in your router).

Extra modules

Then for extra modules. The webadmin was on, so I could just go to my home-IP + my new port, let’s say https://192.0.2.0:8000. I had SSL enabled and bad certificates, so you might need to trick your browser into accepting them. In the global modules, I enabled chansaver, lastseen and log. I also had notify_connect, but it felt too noisy for me. Don’t forget to hit the ‘save’ button.

In ‘Your Settings’ I have chansaver and controlpanel on, I believe by default.

For other module configuration I connected to ZNC using Textual. When you add it, you can give it a connection name (this is for yourself). The server address is your home IP, and the port the outside port you put in your router. The server password is the one you put in ZNC in the ./configure step. But then comes the part where I was puzzled: go from the ‘General’ to the ‘Identity’ view, and add your Freenode IRC nickname as ‘Nickname’, but your ZNC username as Username. I used sebsel@Mac/freenode, to identify it later. The personal password is for the NickServ password on Freenode.


After connecting I did /msg *simple_away SetTimer 0, because I want to be set to away the moment all my devices are disconnected from ZNC.

Because I want to have Textual on my Mac, and this new-found Mutter on my iPhone, I have to get ZNC to manage multiple clients. By default, ZNC sees you have read your messages on your iPhone, so it does not send it to your Mac. To keep track of multiple clients, you need the ClientBuffer module.

Since I still had the source, I could just compile the module. So I did:

cd ~/znc-1.6.5/modules/
wget https://github.com/jpnurmi/znc-clientbuffer/blob/master/clientbuffer.cpp
cd ~/znc-1.6.5/
make
sudo make install

After that, I got back to Textual, and did /msg *status LoadMod clientbuffer. After that, you can /msg *clientbuffer help and send *clientbuffer some commands as messages. I did AddClient Mac and AddClient iPhone. You can do a ListClients too to see what you got.

Adding Mutter to the game

On the iPhone app Mutter, I added a network with again my home IP as the server, my nickname sebsel and under Advanced use the port I opened, added the password of ZNC in the first password field. The ‘username’ under Advanced gets the username for ZNC, so I made it sebsel@iPhone/freenode, to let Clientbuffer identify it as my iPhone. If you have notify_connect on you will see that *status notifies you about logging in with your iPhone.

Warning: I didn’t get this next part to work

Next I saw that there is an option to receive notifications from ZNC to your iPhone via Mutter. You will need their mutter-push module for that, and that requires ModPython, so that’s why I added the flag --enable-python during the first make.

As their explanation says, first grab the mutter package, then make sure you got the right python libs, and then move mutter.py to ~/.znc/modules/.

cd ~
wget https://bitbucket.org/jmclough/mutter-push/get/master.zip
unzip -d mutter -j master.zip
cd mutter
sudo apt-get install python3-pip
sudo pip3 install requests
cp mutter.py ~/.znc/modules/

In IRC, make sure to /znc loadmod modpython and then /znc loadmod mutter (or send a message to *status with loadmod modpython etc.).

This last part of getting notifications is still not working for me. I still wanted to post this though, because all the other things work. Hope I’ll get back to notifications soon, when I do get them to work.

Daily and monthly overviews

This weekend I worked on some things on Seblog, and since I did some productive work on other projects today, I feel like I can write a blogpost about it without sounding so procrastinating.

Inspired by Aaron Parecki's monthly overviews, and triggered by @zegnat, who was looking for the same type of page on my site, I started to 'deconstruct' my URLs. You can now remove parts of it and still get useful pages. That was on my list of itches since november 2015 now.

So let me explain my URL design first. This post, for example, is /2017/06/20/1/daily-and-monthly-overviews. This is an idea I got from the wiki, and probably also originates with Aaron. The identifying part of it is the date, followed by an ID (the nth post of that day). The slug is just for humans and can be omitted: you will get redirected to the right one. Some posts don't even have one. This allows for a Whistle-style URL shortener which I run at 5eb.nl. (This post can be found through 5eb.nl/4ox1.)


The first step was to remove the ID, to get to a day view. I just list all the posts that are created on that day, including private posts when I'm logged in, but oldest-first instead of the newest-first order of my feeds. I also display a summary of the day in icons at the top. I'm really pleased with how it turned out!

After that, I also wanted the monthly view, to get a better overview. I'm really pleased with that too, it's nice to go through my old posts this way, seeing old memories. I'm now more interested in importing my Facebook posts too. I am still looking for a way to have some anchor or summary of the day in my monthly view, to find posts quicker, and adding a location like Aaron might do the trick, but I'll have to figure out how to do that still :)

I'm quite happy with this for now!

@-mentioning people on my blog

The past week I mentioned both Martijn and the Twitter-account of the Dutch Railways (@ns_online) in different blogposts. For Martijn, I used a hand-written link with the proper .u-category.h-card classes to person-tag him. [see update below] For @NS_online, I wanted to @-mention them in the POSSE'd tweet. Martijn complained that my blog didn't autolink them, so that's what I fixed now.


I have a new syntax to @-mention (and thus tag) people in my blogposts.

  • I want to match names like @name
  • I don't want to match the word @-mention itself.
  • I want to be able to escape the @-mention with a \, like \@name, so I can talk about @-mentions in a blogposts (this one, actually, I like meta-meta-meta).

Then the syntax. Obviously I use an @-symbol, with a name behind it. I then check the name for the following:

  • Is the name on my list of names? Then use the URL I provided.
  • Does the name contain a dot? Then assume it's a domain / URL itself, so add replace @ with http:// (@seblog.nl becomes <a href="https://seblog.nl/">Sebastiaan Andeweg</a>)
  • And if it doesn't contain a dot, assume it's a Twitter account.

I then fetch the h-card (or profile information) from the resulting URL, and use the name that's there.


There are times, however, where I want to specify the name. In the example at the beginning of this post, I called Martijn 'Martijn', not 'Martijn van der Ven', which is on is h-card. Sometimes a full name makes no sense. So I can add the name I want to use in brackets behind the tag (@Zegnat[Martijn]). This way I have total control over my text (and possible conjugations if I start writing in a language that needs those, not that I speak one).

Then it all comes down to the following syntax:

@namefromcache        > the URL I specified
@someone.com          > that URL
@facebook.com/someone > also the literal URL
@twitteruser          > their Twitter profile URL
@someone[This Person] > my own name for them
\@someone             > escaped tag

I now need to redo my automated webmention-sending, for it does not yet recognise these tags. Manual sending works fine!


Edit: after some discussion during the Virtual HWC EU-time, I realised that just doing @someone is not really person-tagging them. Person tagging is explicitly saying "I am now with this person", which makes sense for photos and checkins, but not always in blogposts.

I added a minor tweak: I can now use + instead of @ to really person-tag someone. The @ is used for just a mention, the +-mention will receive the class="u-category h-card" markup. I don't know how much I will be using that, but I have that option now.

als antwoord op Jay Robinson

Hi! I saw your like and your re-webmention (because the picture is broken). I think I should've found the right author using all the steps on /authorship – XRay does find it and I'm thinking about switching to using that for my mentions.

What I did see on your side, however, is that you have a p-author outside of any h-*.

I think my site would've found your h-card if it was the first thing on your homepage, or if you would've extended your h-entry to include that p-author h-card. But that only makes your site easier to parse, I should've found it with this already :)

The number of slices of German bread and the number of slices of Junger Gouda mild-würzig are off by one. Tomorrow will be a sad day.

Day 45: receiving reacji

A little while ago I added reacji to my site. Since reacji are just comments who's content contains only one emoji, I did support reacji before the change. I only changed the way I displayed them, when I send them.

One thing I noticed after my return to Facebook, is that the like-button now has several nuances. These love, haha, wow, sad, angry-things are sent by Brid.gy as emoji. Because of this, it didn't took long for me to receive my first reacji via webmention. They just showed up as comments with one emoji.

So today I fixed that:

Note that I already used a heart icon for likes. I want to keep it that way, the emoji looks different enough to distinguish them. If you comment on Facebook with a heart, they display it as a comment with a heart, and I will just show it as a like, like above. But I'm fine with that. You can also reply with other emoji if you like.

Oh, and I fixed the images now too.

Every social network has its own dynamics, and when you leave for a couple of years, you need to take the time to familiarise yourself with the tone of communication again. At least, that is what I tell myself when I'm spending hours and hours on end scrolling through Facebook.

Day 44: hooking up Brid.gy

Yesterday I re-activated my Facebook, for the first time since 2.5 years. Still not really sure about this silo-return, but I want to try it again. Facebook is a powerful tool, and with the other tools IndieWeb gave me, I think I can manage my relation to it better than I could 2.5 years ago.

At first sight, it might look as if IndieWeb is about stopping silo's. In that light, a return looks strange. But there is no IndieWeb principle that says you should quit Facebook or Twitter. As long as I POSSE, I own my data, and I can still connect to my silofriends.

I still want to minimise the actual time spent I on their site. So today I made the first few bridges that should make that happen: I hooked up by site to brid.gy/publish and the 'normal' Brid.gy backfeed for Facebook. Now I can post via Micropub to my site and automatically post to Facebook too. Any comments and likes received on the post on Facebook will return to my site as well.

Now I have to make some interesting content to test all this with.

Also just realised I have no-one to talk to about this. It feels so lonely, being connected again, because nobody shares that 'again' aspect of it. Everyone I know is on Facebook, or I think they are, and I don't want them to happily poke my newly activated account. I want to see what Facebook does with my account. Will it try to bring old posts under the attention of friends, to give me likes and comments, so I stay? Or will it be unnoticed?

Now I have to go to a real-life event. I will try and resist telling people about my Facebook adventure. (That's why live blogging about it in English seems a good idea. I think this will be unnoticed as well.) The nice thing is: I can just post an RSVP to a Facebook event via my site. Will hook up Brid.gy tomorrow, if I still think Facebook is a good idea then.

You guys have no idea how scary it is to log in to Facebook after 2 years. (I have been back for 15 minutes at the 0.5 year point to transfer ownership of some Pages.) My profile picture is still the one from back then (although the black and white one I use on this site is actually older). There are 97 notifications in the world-icon and I don't want to click them. I scrolled through the feed, a few posts, and they all look like personal insight in lives of people I haven't seen in years. With every move of my mouse I feel like the addiction is right around the corner. But it could be me, freaking out, because I know the countless hours I spent scrolling that page. I have no idea what I want with this.

I'm logged out again. No disabling, just logged out. We'll see tomorrow.

Day 43: The silent return

Okay, I am going something I didn’t expect doing for a long time. I am still uncertain about it, but my curiosity and my love for round numbers won today.

Today exactly 2.5 years ago, I disabled my Facebook account. I did quit for various reasons, varying from ‘omg my privacy’ to ‘I spent too much time on here’ and ‘they have too much control over my newsfeed’ and ‘they will disappear soon anyway’. I still read articles from people struggling with those issues, except for the last one: Facebook still didn’t disappear. (What was I thinking?)

In the past 2.5 years, I had varying levels of FOMO. Most days where fine, especially later on when I got detached enough. But some days, after nights with friends, citing things that happened elsewhere & on Facebook, I felt I missed a lot. The sad thing is that there’s no way to know for sure.

So my FOMO changed from ‘I am missing stuff’ to ‘Am I missing stuff?’ I am not sure, but I probably am. How bad is that?


Quitting Facebook is about taking responsibility for your social life again. You need to track birthdays yourself, you need to actively reach out to people to meet them, you need to discover events for yourself.

I’m not saying I’ve accomplished to do those things myself over the past 2.5 years, but I’m also not saying that I will let Facebook fully handle them again. I’m not even sure Facebook still fills those needs these days. 2.5 years is a long time on the internet. But I am genuinely curious what Facebook does nowadays. (I’ve heard a lot about fake news and filterbubbles. Sounds cool.)

There is another part to returning that I’m not sure about. To get all the ‘benefits’ of being socially connected via Facebook, you have to spend a lot of time on the platform. I actually don’t really want to put in that much work. I know, I will be addicted to the likes and pokes within days, and I won’t notice all the time that goes in. But that was not how I intend to use Facebook over the comming month.

Ideally, I want Facebook to be a box. Or a hole, a well maybe. I want to throw in stuff, and I want to get stuff out, but I don’t want to be in the box/hole/well myself all day. I want to check once a day what happened, via an interface that doesn’t want to drag me in. (I can make one myself, I think.) And I want to post stuff on there like I post things to Twitter now: I just write it on my blog and then click on ‘also to Facebook’. I don’t want to login there to post something and get distracked.

And this is the last dilemma. Facebook gives an external boost to your ego. I could use that sometimes (we all do, right?) but it’s not the healthiest thing. Is it the demanding interface and the addictive notifications that are bad, or is the service itself the harmful thing? Should I want to share my thoughts with other people, or do I need to learn to be content with them myself?

Either way, I’m not back at Facebook in the sense that I’m completely hooked again like I was when I left. Being gone for 2.5 years makes that the interface is completely different. (I have seen it at other peoples computers, of course, so I’m not completely unfamiliar, but I have no personal bond with this layout.) Let’s hope I can contain this beast. And if not, I will simply leave again, because I know the world won’t end if I do.


And now for the action: I’m going to log in, see that it’s enabled again, and leave it like that. The silent return.

Day 42: multi-photo

Yesterday, I went to Den Helder for a day. Besides doing some work, we also made a walk through the dunes. Such walks produce pictures, somehow, and I wanted to post some of them here.

Since I didn't want to create multiple posts, it made sense to create a list of photo's in one post. Instagram also launched a new post type with multiple photo's, and this seemed to be a good match for it.

So yesterday I made a quick foreach loop to be able to post them and today I styled it some more with CSS. It's not as pretty as the Instagram presentation of a multi-photo post, but I didn't want a carrousel like they use. The pro is that the images are viewed one by one, not influencing each other that much, but the con is that it's hard to signal to the user that there are more then one picture behind the post. I like the list as it is now. It's kind of long, but it works.

Day 41: IndieAuth in the toolkit

Today, I moved some existing code from my kirby-micropub plugin to my indieweb-toolkit, and then I rewrote it a bit. It is the code that checks for an Authorization: Bearer xxx header and rejects people that have the wrong token.

At this point, my blog just uses tokens.indieauth.com, as it's token endpoint. So, that is what the toolkit uses now too. This is not ideal, and I plan on adding a token endpoint directly to the toolkit. But, everything in steps!

You can now do the following:

indieauth::requireMe();
indieauth::requireScope('create');

// do stuff!

And then the script will exit if there's no Authorization: Bearer in the header with the proper scope and a 'me' value corresponding with the current URL. (You can also pass in a 'me' to check against.) I am still not sure about some things, so I am putting them out here to think about them some more. Feel free to comment.

  • Is 'IndieAuth' the right name for this static class? I think so, because it uses 'me' and 'scope'. But at this point, it's only checking tokens. And when I add a token endpoint, is that token endpoint still IndieAuth?

  • In my code, I now check url::host($token->me) == url::host($requiredMe)). I only compare hosts, so seblog.nl, which works, because seblog.nl/micropub still has the host seblog.nl. Maybe I should drop this 'use the current URL if the $requiredMe is empty' and only go for explicit 'me'-values.

  • Previously, I threw Errors. Now, I just set the HTTP-header and exit the script. I wonder which way is more elegant. The way I do it now, makes sure the right HTTP status is sent, but the way I did it before allows for more customisation. Both ways exit the script, which is the most important part.

Day 40: reverting repost changes

I changed my mind about reposts, again. This is what we call voortschrijdend inzicht in Dutch.

A few days ago, I changed how I display reposts. In an attempt to honor copyright, I only display the first 50 words of a repost. This way, it's more a quote than a full copy of the content, but I can still retweet stuff, since cramming 50 words into 140 characters is doable, but rare.

What's more: I only showed the repost in the feed, not on my permalinked pages. I redirected those permalinks to the original permalink. This way, while I had the original content imported on my site, I wasn't actually re-publishing much of it.


But today I reposted a much reposted post of Aaron, and then it stuck me: I can't send a webmention, in the 'oh look a comment' kind of way, if I don't have a permalinked page with Microformats on it.

In a way, a 302 redirect has the URL of another page on it by using a HTTP Location header, so it does link back to the original page. The question is then: is that a valid link for sending a webmention? And: does a 302 redirect on the source URL to the target URL imply a repost of the target? Not really, I think. It's just a redirect.

So I got rid of the redirect of my permalinks, giving my reposts their page back. I still only display the first 50 words of a repost, making it more a quote than a repost. But aren't reposts just full quotes? It's still the major part of the content of the post. I will keep it that way for now.


Edit 20:17 CET After some discussion on IRC, I decided to also ditch the 50-word-cutoff. Only showing the first 50 words of a repost makes it a quotation, not a repost.

The need for the 50-word-cutoff was born because I felt uneasy reposting a whole article. The solution to that is: don't repost a whole article. The problem was that I already reposted a whole article, because at that time, I found it important to keep it online, in case the original server would collapse under a lot of trafic. The next day, that wasn't a reason to keep it on my site anymore.

So, I changed that single post to a bookmark (replacing only repost-of to bookmark-of in the .txt of my post) and now I'm good again. I removed the code that showed only the first 50 words. If I ever want to quote something, I can use quotation-of, but for now, I'm fine.

Meer laden