Photo

Currently: is in transit

Last spotted: in transit between San_Diego and Boston

Next: course set from Boston to Portland,_Oregon

30th May 2016

Minimal ActivityPub update client

Today I finished morph, a client for posting ActivityStreams2 Update activities to an endpoint. The server handles this update activity however it wants, but the obvious thing to do is take the object of the activity and make the indicated changes.

So far it:

  • Doesn't have proper authentication, just a field to enter in a key that the server uses to verify me.
  • Doesn't do endpoint discovery, so I have to type that in as well.
  • Only understands how to display ActivityStreams2 Collections, and only knows how to edit items within the Collections.
  • Specifically only knows how to add name, published and tags to items in a Collection.

Will be expanding its object editing abilities soon.

Code on github. See also: Minimal ActivityPub update endpoint.

hacking, morph, php, social, swwg, activitystreams, as2, cv, json, photos, resume, socialwg, activitypub, activitystreams2, client

31st May 2016

Got lost in MIT again but discovered a puppy therapy lab and a 5 storey metal sculpture of an atomic structure so net win

puppies, mit, life

29th May 2016

Hot chillis and hot strong coffee. My favourite flavour and texture pairing.

food

28th May 2016

Minimal ActivityPub update endpoint

ActivityPub updates objects by posting an ActivityStreams2 Update Activity to the authenticated user's outbox (discovered from their profile).

I store my photo albums as ActivityStreams2 Collections, so this morning I made a minimal AP-compliant update endpoint today that lets me add captions to them. This is just the server componant. It lets me do:

 curl -vX POST -H "Content-Type: application/activity+json" -H "Authorization: secret-token" -d @as-update.json https://path/to/endpoint

where as-update.json contains:

{
  "@context": "http://www.w3.org/activitystreams#",
  "type": "Update",
  "name": "Amy captioned a photo.",
  "actor": "http://rhiaro.co.uk/about#me",
  "object": {
    "id": "https://uri/of/photo.jpg",
    "name": "A brand new caption."
  }
}

So far this replaces the entire object with the object embedded in the Activity. Hopefully we'll have a syntax to indicate partial updates in AP soon.

The code (PHP) at https://path/to/endpoint contains a few functions that are at the discretion of the server (how to verify the authenticated user can write, what to do with the activity once it gets it, and exactly how to perform the update):

function verify_token($token){
    // Magic to verify token passed in Authorization header here.
    // I check it against a protected file on the server that contains a randomly generated long string.
    return $response;
}

function store_activity($activity){
    // Arbitrary server logic to store the activity that was posted.
    // I just dump the JSON in a file.
    return true;
}

function make_update($activity){
    // Arbitrary server logic to perform the update on the object.
    // I parse the value of object in the activity to work out where its data is stored in the filesystem, then rewrite the appropriate JSON file.
    return true;
}

And here's the overall flow:

// Authentication
$headers = apache_request_headers();
if(isset($headers['Authorization'])) {
  $token = $headers['Authorization'];
  $response = verify_token($token);
  $me = @$response['me'];
  $iss = @$response['issued_by'];
  $client = @$response['client_id'];
  $scope = @$response['scope'];
}else{
  header("HTTP/1.1 403 Forbidden");
  echo "403: No authorization header set.";
  exit;
}

if(empty($response)){
  // Something went wrong with verification
  header("HTTP/1.1 401 Unauthorized");
  echo "401: Access token could not be verified.";
  exit;
}elseif(stripos($me, "rhiaro.co.uk") === false || $scope != "update"){
  // The wrong person and scope was returned when the token was verified.
  header("HTTP/1.1 403 Forbidden");
  echo "403: Access token was not valid.";
  exit;
}else{

  // Verified, good to go..

  if(empty($_POST)){
    $post = file_get_contents('php://input');
  }

  if(isset($post) && !empty($post)){

    // Store activity
    $id = date("Y-m-d_h:i:s")."_".uniqid();
    if(store_activity($post)){

      // Perform the update 
      if(make_update($post)){
        header("HTTP/1.1 201 Created");
        echo "Resource updated";
      }else{
        header("HTTP/1.1 500 Internal Server Error");
        echo "500: Could not make update (probably a permissions issue). ";
      }

    }else{
      header("HTTP/1.1 500 Internal Server Error");
      echo "500: Could not store activity log (probably a permissions issue).";
    }

  }else{
    header("HTTP/1.1 400 Bad Request");
    echo "400: Nothing posted";
  }

}

?>

Obviously I've stripped out my implementation-specific stuff to make it easier to read. The actual code on my server is here: github/rhiaro/img/pub.php.

The next thing I need to do is make a client that...

  • authenticates the user (I usually use IndieAuth, delegating the hardparts to https://indieauth.com),
  • discovers the update endpoint from their profile (which to conform to AP right now would be via a JSON property outbox),
  • presents a UI that lets the user choose a collection to edit (could be discoverable from profile via streams property, but to start with I'll probably just offer a URL input),
  • posts the new values to the update endpoint.

photos, server, socialwg, activitystreams, as2, json, php, social, swwg, activitypub, activitystreams2, hacking

23rd May 2016

San Diego 03

We took a scenic drive through the desert, through Ramona, St Ysabel, Julian, and a bit of the Anza-Borrego Desert State Park. The desert here is piles of rocks, lots of scrub and occasional cacti. The roads twisted between foothills or cut straight through the sides. We walked a little away from the road and had lunch in the sun with some stunning views; then stopped in quaint Julian - famous for apples - on the way back for apple pie (their traditional apple and all suga-rfree varieties are vegan). I chose boysenberry and apple.

We're both exhausted, despite having been sitting in a car for most of the day. I guess watching miles of foothills roll by took it's toll.

We had dinner at Sipz, a mostly vegan Asian fusion restaurant in Clairmont. Miso soup, edamame, BBQ 'pork' bun, dragon roll (very saucy), spicy basil with not-chicken and brown rice. Most of that is for breakfast. The had some great desserts I wanted to try, but no space.

couchsurfing, diego, vegan, ca2016, desert, san

21st May 2016

San Diego 02

Sitting on the sofa in my host's lovely home after a fun evening with her family. Fiona, the timid cat, was eyeing me up like she wants to be on the sofa but is too shy to ask. She eventually elected for the top of a big cat toy across the room, from where she continues to watch me resentfully. Yoshi, the less timid cat, is content in a little basket.

I got up lateish this morning and after coffee and breakfast and talking about pets, my host and I drove to La Jolla, an upscale seaside neighbourhood in the north of San Diego. We walked along the coast, enjoying the sun, watching the waves crash and baby seals play in the surf.

We drove back to pick up supplies and make lentil and black bean chilli, cilantro and almond pesto (who knew pesto goes with chilli) in time for her nieces and their families to arrive for dinner. A nice evening talking about travel, tech, and life in general. A four year old instructed me on stirring the chilli, ate copious amounts of my homemade coconut oil+cocoa+coconut sugar chocolate, and made me draw snowflakes and build a helicopter from blocks. Once I was on the floor amongst the child chaos it was hard to get up again.

lajolla, travel, vegan, california, diego, san, usa, ca2016, couchsurfing

CouchSurfing reminds me that people are SO NICE it warms my heart. And you know me, I don't even like people. Maybe it's just the kind of people who give strangers a key to their home, offer them anything in their fridge and even drive them around. I'm SO glad I didn't hostel San Diego, and cost isn't even on the list of reasons.

couchsurfing, san, ca2016, diego, travel

San Diego 01

I arrived in San Diego on the Greyhound, struggled to figure out how to top up a public transit card with anything other than a $7 day pass, gave up and jumped on an approaching bus because they're infrequent, didn't have the right change so resigned myself to giving up $5, and a nice lady supplied my missing $1 so I could make the correct fare after all. So that was a welcoming start.

The bus announcement voices have a kind of lisp... "stop requischtid"

Turns out San Diego is one of those US cities where I can't get a data connection on my phone.

My CouchSurfing host had been held up, so she let me know where to find the spare key, and I let myself into her house, and hung out with her beautiful fluffy cat, Kafka. Kafka wanted all of the cuddles.

My host came home and we drank tea and chatted. I went to Sprouts grocery store (very similar to Wholefoods) for a quick instant-noodle dinner, then eventually crashed. I had a mattress on the floor in a private room. The next morning my host left for work before I woke up, and I enjoyed a reasonably productive morning on her couch catching up on life and administrative tasks. Kafka helped with my CHI expense report by sitting on all of my receipts as I tried to sort them out.

Eventually I ventured out. I walked through University Heights and Hillcrest, cool districts with lots of lively restaurants and thrift shops. I found the Spruce Street suspension bridge, which is where a normal neighbourhood is suddenly a canyon full of trees with a massive bridge across. It was stable, but moved just enough underfoot to be unnerving.

I proceeded to Balboa Park, which I've heard was worth going to, but imagined like a park, not massive canyons and hills. It felt wild and had groundhogs darting around but it's also sliced through by freeways, so had that special USAmerican kind of nature vibe. There were pretty good views of downtown San Diego from some points. By accident I ended up in the central part of the park which is suddenly civilised and full of museums (none of which were free). There's a botanical 'building' that looks like it's made from massive bamboo straws or something. Lots of people around and I walked through the background of at least one wedding and one graduation ceremony. I saw cable cars overhead and looked for them, but figured eventually they must be in the zoo. I wandered more, aiming for where HappyCow told me would be a vegan restaurant. I found the WorldBeat Cultural Center, which it turns out is where the restaurant was, and hung out there for a couple of hours eating Jamaican curry and a big cinnamon roll. Food was good and cheap, and atmosphere was quiet and friendly and hippie. Stuff going on in the background like business meetings and dance classes; was a nice backdrop to get my laptop out for a bit.

My legs were aching by that point. Not from the 7 mile walk I'd just done surely... but perhaps from the fact I'd walked about an average of ten miles every day for over a week. My CS host offered to pick me up! Which she did, and then gave me a driving tour of downtown San Diego, and Coronado island. Coronado is an upscale neighbourhood on an island, surrounding a military base, reachable across a massive road bridge. We parked and took a walk along the front; mostly fancy hotels, beaches, posh people..

We ate at Muzita Ethiopian restaurant (yum!) and my host dropped me at a transit station where I caught a bus to my next CS destination.

My new host picked me up from the bus stop! (Americans and cars! Not complaining..). I met her kitties and we talked about pets and breakfast and plans for the weekend. Then I went to sleep in a lovely room of my own with a real bed in it.

couchsurfing, san, usa, balboa, california, diego, travel, vegan, ca2016

19th May 2016

I had a really great experience at @mendocinofarms this evening. I was on my way to Golden Mean when I stuck my nose in to see what they had, and ended up staying for a vegan Samosa Dosa, and iced tea. Unusual service sequence of: order with the staff on the door, who then gives you a tracking device and sends you to the counter to pay, where you also get bombarded with free samples of salads (spicy potato salad was ace!). The Samosa Dosa is a hefty wholewheat wrap containing curried cauliflower, chickpeas, potatoes, spinach, onions and some kind of mayo-y substance. It was really filling and delicious; every time I thought I understood it I'd encounter a new flavour or texture combination. And the iced tea was incredible. It's black tea, unsweetened (or I wouldn't have bothered) but it contains passionfruit (which I didn't know when I ordered) giving it this awesome delicate floral twist. It's also a nice space to chill, and I stayed there for a couple of hours pootling around on Twitter. The staff were really sweet, cheerful and friendly and after about an hour and a half kept coming over to offer refills of my iced tea (I declined, I was stuffed). To top it all off, it was very reasonably priced. To top it all off, it was very reasonably priced. At least, compared to what I'd been getting used to paying in LA: sandwich under $9 and iced tea around $3.

I recommend! cc @veganstraightedge

Samosa Dosa and iced tea, with empty free sample dish in the background

food, vegan, travel, monica, la, veganstraightedge, usa, santa, mendocinofarms

18th May 2016

On the bus back from Venice Beach to Santa Monica, serious FOMO on all the vegan restaurants / ice cream shops / food trucks I'm passing. Must exercise restraint.

food, vegan, ca2016, travel

15th May 2016

There's a suspicious lack of greyhound bus I'm supposed to be boarding any minute now, but on the other hand Santa Cruz is a place I wouldn't mind being stranded in.

ca2016, greyhound, travel, cruz, santa

14th May 2016

Many big trees (Santa Cruz 03)

Deflating in beautiful Hidden Peak teashop. No photos, because no electronics allowed! I'm sinking into a soft, velvety plum red chair with dark wooden arms. The decor is tea paraphenelia, Asian rugs, paneling and wood carving. I can't place the music; it has a Middle Eastern Lint and is chanty. In the front of the shop are tea hardware and decor for sale as well as shelves of books. Lamps and dragons. The seating ranges from wooden chairs and stools to squishy (yet still elegant) armchairs and couches. The lighting is soft with a burgundy ambiance from the walls and dark wood flooring and furniture.

I'm sipping Dama, a Yunnan, and couldn't resist picking one of their four raw vegan desserts (an orange, cardamom cup with cashew cream). They have $400+ (per serving) pu-erhs on the menu, which made me smile. They're very serious about tea here. As anyone should be. I came across this place by accident as I wandered through town looking for a place to sit, and it's perfect. There seems to be a guy here who has brought his tea-novice friends for a pu-erh tasting. That's a test of a friendship.

I'm unwinding and sinking and stretching because I walked about 15 miles today. I'm glad I managed to drag myself out of bed for the 0830 35A to Big Basin. I followed this guide and started out on the Sunset Trail, through forests of giant Redwoods. I deviated by accident to Timm's Creek and doubled back to see Silver Falls and Golden Falls after Berry Creek Falls. Despite this, I remained between one and two hours ahead of schedule according to the times given in the guide. I also detoured (deliberately this time) to Sunset Camp; the guide said not to bother but the trail up was very pretty. A change in foliage, footing and lighting from the forest.

The stretch that followed Waddell Creek was long and samey. But the guide hadn't prepared me for the stretch around a precarious edge of a mountain with a beautiful view of Waddell Beach. Seeing the destination made the last few miles a little easier; especially when the destination was glittering sea and sand.

Ready to thrust my feet into the ocean, I came across park rangers with a variety of local snakes. My new friend Bandita (a King Snake) investigated me throughly before folding herself in half and nesting under my hoodie, stretched around my bank in the nook left by my backpack, with her middle poking out one end and her head and tail out of the other. I patiently stood for about 15 minutes as other hikers came and went, none committing to take over as snake-bed. Eventually I had to wake her so I could go collapse on the beach.

I had 45 minutes before the number 40 bus back to Santa Cruz. I plunged my feet into the mouth of the creek and ate leftover Saturn Cafe pie. When heading back to the bus I saw humpback whales spraying and playing in the surf.

I had no phone signal all day, and after the 40 minute bus ride I walked through downtown looking for somewhere to sit down and catch up. And yet it's somehow a relief that Hidden Peak tells me I'm not allowed to.

Oh, I did only eat old bagels all day after all. And a banana, leftover noodles, some chips from the bus station, and leftover pie. Later... pizza.

usa, walking, santa cruz, ca2016, redwoods, travel, vegan, beach, big basin, hidden peak, tea

Santa Cruz 02

Following my stay in Linda's Seabreeze Cafe, I accidentally walked ten miles. Around beaches, through parks, to Twin Lakes and along traintracks back to the Boardwalk; entertaining an idea of going on the Sky Gliders, but they were closed. I also entertained the idea of a toffeeapple (available in great and exciting variety) as I wandered through the evening buzz of the funfair. I resisted. $7 pricing helped. I did google taffy to see if it's vegan though (unlikely, butter).

Having neglected to eat I stumbled with relief into Saturn Cafe and downed a BBQ ranch not-chicken burger and fries. I also got a berry apple pie with mint chip ice cream but suddenly the burger caught up with me and only managed a bite of pie. Food was average veggie-diner style, prices higher than average. They had a wide choice though, so it's possible I just happened to pick a particularly uninspiring sandwich.

Absolutely stuffed, I stumbled back to the trailer with vague intentions of heading out to Wholefoods for lunch supplies for the next day (so I wouldn't have to eat only old bagels). Instead I napped, woke back up just long enough to watch Perfect Sense on my laptop, then went back to sleep. My hands and forearms and face are tanned, my shoulders glowing red.

beach, cruz, travel, vegan, ca2016, santa, usa, walking

13th May 2016

San Jose

I didn't have high expectations for San Jose, so it was fine. The weather was good all week and vegan food was easy to come by. The middle of Downtown is nice enough, and the university campus is pretty and green, but otherwise kind of... not desolate, but industrial I guess. Contrived. Everything was closed or not serving food by 9 or 10pm, which was inconvenient. The Martin Luther King Jr Library is a good place to work; quite, plenty of desk space, and nice views of the city from the higher floors.

I ate... a vegan hotdog at Original Gravity; various Asian food at Vegetarian House (twice, friendly, taro smoothie!); rice and beans burrito at Iguanas Burritozilla (twice); bubble tea from Boba Bar (soy milk options) and ThirsTea (all made with non-diairy creamer, bonus points for punning); fresh watermelon juice from the place next to Boba Bar; delicious healthful hearty meals and amazing Mayan chocolate pie from Good Karma (twice); sushi from Fuji Sushi; coffee from Social Policy.

I ran the length of Guadalupe Park, and wandered around the rose garden. It was sometimes isolated, and sometimes the highway was audible or visible.

CHI post later..

ca2016, san, usa, jose, travel, vegan

Santa Cruz 01

I'm in Linda's Seabreeze Cafe in Santa Cruz. Feels like it's full of locals. Coffee is nice, in a large mug. Staff are friendly, reporting back from time to time as they discover things in their kitchen which are vegan. They have a few things on the menu, but only big meals, so I enquired after smaller things. I'm not hungry anyway, I only wanted coffee. The sun came out since I've been in here. It was grey when I walked. I'll finish my coffee, then continue walking to Twin Lakes. Oh that might be a while, I just got an impromptu refill.

Santa Cruz so far feels pleasant and friendly. The Boardwalk is tacky... fairground rides, candyfloss, toffee apples... but somehow still charming. I walked around as the sun was setting last night and everywhere felt quiet and calm. Until I made it to the end of the wharf, which, underneath, is populated by noisy sealions. They bark and snort and sneeze and groan. I found a spot that was lit well enough to see a heap of them and watched them sleeping in piles, climbing over each other, awkwardly hauling themselves in and out of the water and over and around their buddies.

I'm staying in an AirBnB, an adorable trailer in someone's backyard. It's tiny, only has a bed and some shelving inside. The bathroom is across the yard. A tiny space to myself in a quiet town is exactly what I need for a few days post-conference.

I might go on the cablecars (Sky Glider) on the Boardwalk later. And maybe swim in the sea. Tomorrow I'm thinking about hiking in Big Basin all day. I need to look out for somewhere I can pick up lunch to take so I'm not eating week old bagels all day.

vegan, airbnb, ca2016, santa, usa, walking, beach, cruz, travel

I love the work by Oliver Haimson about transitioning between idenitties online, and how digital footprints and arbitrary technical decisions make this difficult. ~"What would it look like for a social network site be oriented towards people drifting between identities over time as happens in the real world? Designing for forgetting and decay."

design, gender, networks, social, chi2016, facebook, identity, phd, trans

6th May 2016

This JetBlue flight has free wifi, an empty seat next to me, and it's taking me three hours back in time. Couldn't ask for much more. Free chocolate?

travel, ca2016, jetblue, flight

I'm looking forward to CHI. I think this plane might be full of CHI attendees, I can hear people asking about each other's research.

chi2016, ca2016, travel