in reply to

Last week, Barry Frost released Micropublish, a Micropub client written in Ruby. It's a very slick interface for posting a few kinds of posts. I noticed that his "category" field looked really nice, and discovered that he was using a Bootstrap plugin called "Token Field". Today I added this plugin to Quill, so now everywhere that you previously had to enter tags as comma-separated values, it's now using this "token field" UI.

I also added a new field to the editor to set the published date of posts. 

All this does is include the date you enter as the published date in the Micropub request. It's up to your site to decide what to do with that. For example if you enter a date in the future, your site can decide to not show future-dated posts in feeds, so you can use this for scheduling posts. Of course if you enter a date in the past you can backdate posts such as when importing posts from an old blog.

Released last week? Oh. I guess I’ve been using the “unreleased” version. Now it has edit/delete/undelete functionality! That’s very nice.

in reply to

Of course things like software quality, bad UX (e.g. still none of the hands-off/continuity features work) are a reason for me: why would I pay the „Apple tax“ if „it simply works“ is no longer true?

Another reason is the hardware, and that's a complex one. On one hand Apple hardware is really good, e.g. the touchpads are the best I know. But on the other hand they do stupid things like soldering the SSD and RAM onto the board or gluing the battery. At least the SSD should not be soldered, as I use my hard disks heavily (due to big databases) it is likely that it breaks before the computer is broken.

Also software freedom is a reason. I like the ideals behind the GNU project and think this is the right way.

But my absolutely main reason is performance. Linux performs so much better... I have a script touching and inserting about 2 million rows, one at a time. My Linux finishes the job within two hours, while my macbook needs six(!!) hours to complete the task. The overall performance is so much better, and disk I/O is in its own league.

Yeah, the “soldered SSD” thing is extremely ridiculous. Like, they’re doing everything to make the laptops thinner, even the “Pro” line. Adding M.2 and SODIMM slots wouldn’t even add that much thickness! And M.2 allows the same performance (NVMe) as soldering the SSD.

By the way, Apple trackpads aren’t that special (until 3d touch, at least). They’re literally just Synaptics, same as in a lot of laptops.

liked

I learned a very subtle Ruby trick today.

The Ruby parser will create local variables for every variable that might be set in your code before any of it is run.

irb(main):001:0> if false; x = 1; end
=> nil
irb(main):002:0> x.inspect
=> "nil"
irb(main):003:0>

Compare with just checking for x:

irb(main):001:0> x
NameError: undefined local variable or method `x' for main:Object
from (irb):1
from /Users/aaronpk/.rubies/ruby-2.1.3/bin/irb:11:in `<main>'

Just to confirm what's happening:

irb(main):001:0> local_variables
=> [:_]
irb(main):002:0> if false; x = 1; end
=> nil
irb(main):003:0> local_variables
=> [:x, :_]
irb(main):004:0> x.inspect
=> "nil"
irb(main):005:0>

This may not seem particularly unusual at first, but has some surprising results when combined with, for example, Sinatra. Imagine you have this code that attempts to accept both a form-encoded and JSON post body.

post '/example' do
  if request.content_type.start_with? "application/json"
    begin
      params = JSON.parse(request.env["rack.input"].read)
    rescue
      return {error: "Error parsing JSON."}.to_json
    end
  end

  # etc etc
  # but params is always nil, even for form-encoded requests!
end

What's wrong with this picture? Well, the Ruby interpreter sees params = in the code and allocates a local variable. At that point, the hash that Sinatra sets isn't accessible from inside your block, so params will be nil when you try to use it!

The trick is to avoid setting params in the first place.

get '/example/:id' do
  if request.content_type == "application/json"
    begin
      payload = JSON.parse(request.env["rack.input"].read)
    rescue
      return {error: "Error parsing JSON."}.to_json
    end
  else
    payload = params
  end

  # etc etc
  # now you can use `payload` instead of params
end

Thanks @donpdonp for the hint!

in reply to

In this interesting article Wesley Moore writes about switching away from macOS. He writes about his motivation and reasons:

  • Access to regularly updated, pro hardware.
  • Not restricted to Apple hardware that makes choices that I don’t value, such as:
    • Removing the Esc key.
    • Removing all legacy ports necessitating the use of dongles for everything.
    • Prioritising thinness and weight over everything else.
  • Access to hardware that Apple doesn’t make, such as 2-in-1 laptops.
  • Getting comfortable with an alternative before I’m forced to.
  • The ability to inspect and contribute to the OS I use.
  • Using an OS where developers are first-class citizens.

I can understand his reasons: I for myself have similar problems with Apple nowadays (besides the moral issues). Interestingly he also favors elementary OS:

Elementary is stunning and definitely my favourite. It won’t appeal to everyone but their philosophies and direction really resonate with me.

I'm trying out elementary as well (using it for a week now, I am pretty happy with it), so it was nice to read that somebody else likes it as well - especially since loads of Linux users I know think that this not the way Linux is supposed to be.

I think some people didn’t like how Elementary is asking for money (pay what you want type thing) on the download page for some reason…

Honestly, I recommend not being tied to a particular OS and just, like, using all of them. I have Windows on my desktop, FreeBSD on my laptop, RPi and servers, Arch Linux in a VM… no (actively used) Macs anymore though :D

liked

Our third visit to Wales was in autumn, and though I've not yet been there during winter, I can safely state it's always beautiful.

Beddgelert is a small community; the name of the place originates from a sad story of a heroic dog. It can offer you magnificent views of the local mountains and hills so don't miss it if you're close.

Our third visit to Wales was in autumn, and though I&#39;ve not yet been there during winter, I can safely state it&#39;s always beautiful. 

Beddgelert is a small community; the name of the place originates from a sad story of a heroic dog. It can offer you magnificent views of the local mountains and hills so don&#39;t miss it if you&#39;re close.

in reply to
Recently, the homepage of this blog changed from a static list of recent blog posts to a realtime stream of updates (the list of blog posts is still there, moved to the sidebar). This post tries to document (mostly as a "note-to-self", again) how this "lifestream" works. Note: This is a work-in-progress; I've already got plans to tweak how some of the pieces fit together.

You have an interesting setup – looks like a blog with Webmention support, but GNU social for the microblog. Have you enabled the Linkback plugin on your GNU social instance? It seems to support Webmentions!