Experimenting with React

resume_mobileWorking on Galapag.us allows me to experiment with new frameworks and to try out new design patterns on mini-apps.

React is one of the newer front-end frameworks and rivals Angular in popularity in new JavaScript apps these days.  Created at Facebook, React has done well to allow a developer to make isolated components which have readily-understandable state at any given point in time.  Having been spoiled at Vimeo by their breezily easy codebase, I was excited to try React to see if it would resemble working with Vimeo’s code.

It’s pretty good!  Components aren’t entirely isolated — you still have to find some clever way to inject style, or just settle on styling globally if you don’t want to do it inline (which React allows for).

Anyway, I built 2 mini-apps.  They’re not quite ready for production yet, so I’m not really going to link to them, but…

Resume

I’d been looking around the web and found JSON Resume, a schema proposal that allows for saving one’s résumé details in a JSON format, so it’s easily portable and separated from style and presentation concerns.  Perhaps an even more important goal of the project is to provide an alternative to the horrendous process of uploading your details via PDF or DOC to some job application site, only to have it either mangle the parsing of your file or, even worse, to force you to re-enter all the info into some shitty 5 page web form that looks like it was constructed a decade ago.  And God forbid you should ever have to update your info when you come back to your profile years later.

I figured it would be nice to have this app built-in for free — perhaps entering in all the pertinent data would become a quest to complete.

So I mapped a lot of the pre-existing modeling I already had in Galapag.us into a call to the API server that serves up your résumé data in JSON format compatibile with JSON Resume 0.0.0.

json

This app didn’t have that much complication in terms of interaction or dynamic changes — a straight-forward app making an AJAX call to populate the front-end.

But it’s fairly clean and extensible — and it’s mobile-friendly.

butterfly

Butterfly

The other mini-app I made is called Butterfly, as in a social butterfly.  The goal of Butterfly is simply to provide an easy tool for you to jot down someone’s name whom you just met at your local deli, or at a party, or whatever, so you know how to find his/her name later once you’ve long forgotten.

After all, we remember close friends but often meet so many random people who are still remarkable in their own way in your life, that we can’t remember their names.

This app is mobile-friendly too, and should make it easy for you to load the app on your phone and add the details of someone you just met.

The Bigger Picture

The résumé data signifies that my data modeling is at least getting to an intermediate point where it’s beginning to provide value in having a large datastore but also diverse enough to support applications which need broad access to different datapoints.

And the butterfly data model helps to map the social graph.  I’ve witnessed the torch and pitchfork brigades that attack services which attempt to allow people to post content about other people without their express permission.  While I disagree with this as a supporter of radical transparency, I understand how it’s just not tenable in today’s society.  But at least for those who opt-in and for certain datapoints, those who volunteer should reap all the benefits of a more interconnected virtual world.  So I do plan on rewarding those who share more — with things like the genetic crossing mini-app.

Galapag.us still isn’t useable in the sense that it replaces my daily viewing habits, and it’s not my first choice for a datastore yet.  I know when the site will be getting approachable for others when I start to dogfood it myself.  I keep adding more and more over the years, and refining that which is already there.  Eventually it will become useful, and, hopefully, necessary in terms of providing competitive reputation.

gc

Social Networks are Boring

A common refrain. People will complain that Facebook, or Twitter, or whatever, is boring. What’s usually going on is

  1. their friends are boring,
  2. they’ve reached mental exhaustion,
  3. they try to use social networks less as a social pulse or passive awareness and more as active entertainment,
  4. they reached exhaustion of new content, or
  5. they’re boring.

In a previous job, I’d do 12-hour shifts watching social media, 2 or 3 days in a row. Like, say, on overnights on a weekend. By 6AM on Monday morning, I wanted nothing to do with looking at a computer, and I say that as a completely internet-wired junkie. Sometimes there’s just nothing going on at all. No news. Even the Associated Press wires are just posting baseball recaps. Even the most loserish folks online aren’t busy bashing something on Sunday evenings.  Social media on Sunday overnights is dead.

So hearing from anyone else that one needs to unplug for a while is understandable. What isn’t understandable is the lack of recognition that your boring feeds reflect boring friends or your boring interpretation of what your friends do.

There are variations of this problem: sometimes people don’t follow a critical mass of content creators, so that when they try to view a stream or feed, they barely see any new content, and what content is actually there is boring as fuck.  Some present evidence that Facebook or whatever is dying — well, if you want to cast your widest social net, what’s better than Facebook?  What will possibly be better than Facebook any time soon?  Best place for photos?  Instagram has got that locked up tight, with several derivative competitors trying to offer alternatives (Snapchat).  Social networks are entrenched.  The verdict is still out on video, private social networks, etc.  Maybe reddit is the least secure of the large social media companies.  But I guess what I’m trying to say is that if you claim you’re bored, then your only alternative is to opt-out and go offline, or maybe go underground.

Self-Censored Data

Another variation of the problem, and the main one I want to talk about, is that the types of content that we want to and are able to post lead to limited and boring outcomes, as a result of our ambivalence about personal privacy online, legal norms for data, corporate apprehension toward data liability, etc.

I took some time off working on Galapag.us after thesis presentations ended — I was handling personal matters including moving to a new place with my girlfriend, graduation from school, parents visiting, job interviews, and so on — but I’ve recently started wading back into my code again.

For Galapag.us, I created tons of categories for data for people to enter the moments that occur in their lives every day, such as memories, interactions, loves, hates, etc. Making the data entry part as accessible and as fluid as possible is key since I think anyone who’s done any quant selfing has tired of entering in what food they ate, where they checked in, etc. constantly every day.

My logic is that while physically-generated data is easier to quantify, even the results (aggregation and charting) of it are not very exciting. What good is it to know the flawed number of steps or relative activity level we achieve per day, without further context like diet, circumstances? (sitting at a desk at work, traveling in a plane, skydiving)

Qualitative Data

And so, perhaps as an alternative to that physically-generated data, what we really find meaningful over time might be when and where we had an interaction with someone else, or how our preferences change over time.  Those are the things we remember for years afterwards.

I grew up in a command line interface type world, one of BBSs and MUDs and prompts.  So I started working on an API for Galapag.us so one could access JSON responses via curl, via the web site, or via a command line on the web site (similar to github’s).  The command line on the site let me use angular.js for two-way data binding and for making a nice interface for commands to output.

I started having to think about what new data I could make reachable through the API.  I don’t have a large user dataset yet, so I was considering external APIs. APIs are bad enough these days, as the former best one (Twitter) has been jailed, and most APIs expose almost no interesting public data. It’s cool that data.gov releases a bunch of government data but to be honest 99% of that data is completely fucking boring.  The rest of it is most likely useful only to some NYTimes data scientist who will make some sexy d3 or raphael dataviz that people will cream their pants over.

Facebook, Twitter, etc. are most useful through the data exposed within their networks’ metadata — tracking how circles of friends and followers are related — but the rest of their content is fairly boring. One could say the same about the data that the NSA is collecting.

Instagram is the beneficiary of being the leader for photos, which are the king when it comes to immediate gratification, entertaining content, and pageviews/clicks/PR. The photos we take power today’s social media, now that our networks algorithmically have been around long enough that they’re reaching adolescence (I would think our networks will reach “adulthood” when most of the userbase is old enough that network graph sizes begin to shrink from old age deaths, and the social network providers begin to change their site designs to reflect that contraction in connection to the external self).

Unoffensive and Boring Data Schema

The data itself being exposed for public consumption is fucking boring. The most exciting stuff you might see (outside of, once again, awesome photos from life-changing events that people post, and those swimsuit pics of those people you just friended) are who viewed your profile on LinkedIn (imagine if you could see that on Facebook), or an occasional drunk post signalling the rare chaos added to the polite, custom-filled order of our normal social feeds.

If you need an analogy, the personal data we disclose on our social networks is the equivalent of reading some small midwestern company’s corporate site.  Our front pages (Facebook and LinkedIn) are using, I guess, some shitty flash animation interstitial.  We probably have a shitty about page that barely contains any actual timeline info.  There’s no contact info available.  Check-ins on FourSquare?  A little racier, but maybe that’s just some scantily-clad photo we posted as a camgirl.  Most of the links on our shitty sites are broken or old.  Altogether it’s just a whole shitty experience.

At the same time, we can barely accept this “free use in exchange for using your data to advertise off you” compact we have with large siren servers like Google and Facebook, and we’re scared we’ve already contributed too much data online.

But it’s all so, so boring.  Few of us have the talent and courage to share what’s most dazzling and interesting and inspiring about our personalities and deeds online.  Those who do succeed because they are fulfilling their potential and fulfilling the powerful medium of expression that the internet was supposed to give us.  The rest of us hide our personalities and flaws and desires and failures and weaknesses because that would diminish our carefully curated statures online.

Few of us have enough details online to verify our reputations or trust, show proof of temperament or sound judgment under different bad circumstances, etc.  At the very least, most of us contribute nothing yet consume a lot every day.  People are afraid Facebook and Google and the rest know too much about us, but in reality, we’ve all agreed to some sort of social norm where we conceal what’s really interesting about us and only post the most fluffy, superficial information about ourselves.  We’ve all signed up to a social norm that we must be safely boring.

Dangerous Data

What I envision one day is seeing, over time, how other people and groups of people changed their body types after they had children, or as a result of increased work hours, or seeing the patterns of their lives through the 24 hours of their days.  What I envision is seeing hard data on failed dates vs. attempted dates, aggregated opinion of participants at concerts, sexual data, tracking peoples’ young potential vs. their older outcomes.

You know.  All the data that can be embarrassing to share — the data that often defines us more than any other data.  The data that shows when we’re vulnerable, emotional, petty, impulsive, breaking our own habits and patterns.

And what if the schema, API, and backend architecture also encouraged more scandalous insight? What if the data we collected, and the representation and sharing of it, did, as Jer Thorp wrote in his article “Art and the API”, bring us closer to what we really want to express?

[The] conceptual API. A piece of software architecture intended not only to bridge but also to question. The API as a software art mechanism, intended to be consumed not only by humans, but by other pieces of software. (Promisingly, the API also offers a medium in which software artists can work entirely apart from visual esthetic.)

Burnham wrote in 1968 that ‘the significant artist strives to reduce the technical and psychical distance between [their] artistic output and the productive means of society’. In an age of Facebook, Twitter & Google, that productive means consists largely of networked software systems. The API presents a mechanism for artistic work to operate very close to, or in fact to live within these influential systems.

There’s a reason people love to read the gossip sites all day.  The stories are glitches in the matrix regarding people we know (celebrities).  When order breaks down, we get interested.  Within our digital networks, order rarely ever breaks down.  People tailor their content to fit an identity, maybe not to improve their reputation, but very rarely to degrade it, unless they sacrifice some of it to pursue an issue worth it to them, like politics or sports.

If you want to know why social networks are “boring”, it’s because we’ve censored ourselves into being safe, and boring.

Identity

If anything, this is a stark argument for virtual identities, pseudonyms, and anonymity.  They allow us to act out in ways that we can’t within our main imprisoned identities.  They allow us to interact and experiment without the shaming that could come back to our physical identities.  The inference here is also that our other identities are inherently dangerous.

To me it is not shocking that the government can collect on any of us.  One should always assume that the US keeps the blade of its sword sharpened, and if it chooses to target you, anything you have linked to you is compromised.  What is shocking is the breadth for which the government is trying to piece together disparate datapoints together.  A huge piece of that puzzle is linking random datapoints collected online back to a MAC ID on your network card, so that it knows that “Xeus” and “Ben” are the same person.  Google is trying to do the same thing to get better data on pageclicks vs. pageviews across sessions and page transitions.  This is the key data.

If you want your social networks to be more interesting, you’re going to have to give more online.  You’re going to have to play more, experiment more, fail more.  You’ll have to expand your friend networks to areas you’re not as comfortable in.

And of course you can argue: hey, who gives a shit?, it’s just an online waste of time.  But I wonder how many peoples’ lives are not actually enriched at least a tiny bit by the passive awareness granted by online networks. I actually consider it beneficial knowing almost subconsciously that distant friends and acquaintances are busy raising that newborn or are changing jobs and moving to another country (you know, the heavy lifting of our timelines) even though we haven’t talked.

I think everyone’s going to have to suck it up a bit and realize that a digital life is one worth living to the fullest. The digital life can no longer be neglected or made fun of.

One of the more recent influential articles for me was by Nathan Jurgenson, who wrote about the IRL fetish:

Every other time I go out to eat with a group, be it family, friends, or acquaintances of whatever age, conversation routinely plunges into a discussion of when it is appropriate to pull out a phone. People boast about their self-control over not checking their device, and the table usually reaches a self-congratulatory consensus that we should all just keep it in our pants. The pinnacle of such abstinence-only smartphone education is a game that is popular to talk about (though I’ve never actually seen it played) wherein the first person at the dinner table to pull out their device has to pay the tab. Everyone usually agrees this is awesome.

Completely fetishized.  The reality:

Facebook doesn’t curtail the offline but depends on it. What is most crucial to our time spent logged on is what happened when logged off; it is the fuel that runs the engine of social media. The photos posted, the opinions expressed, the check-ins that fill our streams are often anchored by what happens when disconnected and logged-off. The Web has everything to do with reality; it comprises real people with real bodies, histories, and politics. It is the fetish objects of the offline and the disconnected that are not real.

Publicy vs. Privacy

The power of the people is publicy whereas the power of siren servers, cartels, etc. stems from privacy.  I would argue that we’re fighting a losing battle if we try to pursue even more privacy, government data retention laws, and oversight into surveillance.  We should still pursue strict controls on authorized surveillance as a matter of course, as it’s the only way to solidify gains legally, but the underlying strategy should be more openness, more sharing, more creation of public alibis to verify our reputations and livelihoods.  By withholding information from others, we give those who can still get that information power, since they then have access to data others don’t.  By sharing information, we not only take it out of play in the interconnected data market, we free that data for use in silly experimental games, behavioral economics studies, and so on.

I feel as though the conservatives have been particularly absent from the NSA story, probably because they are conflicted: on one hand, whistleblowing is a fine line between treason and heroism, whereas Big Brother and mysterious government agency behavior is a mainstay of the skeptical conservative.  The liberals on the other hand have gone full-retard.  Their shock that an agency tasked with collecting and analyzing information might try to game the internet is just downright laughable, particularly after almost a decade of encroachment into our communications networks painstakingly whistleblown by brave but mostly unheard individuals.  The liberals are also in disbelief that Obama could do this (!) and have begun equating what “he” has done with the horrors under Bush and Cheney.  It’s like some sort of retarded amnesia.  The final absurdity is that there has been no even half-constructed policy suggestion from the liberals on how to deal with maintaining intelligence superiority through surveillance versus maintaining first amendment freedoms in an interconnected hyperglobalized hybrid digital-actual world.  The NSA of course has blown almost every opportunity to win by just laying out an honest case for the nation requiring such systems in order to maintain superiority in foreign affairs.  I assume it squanders this position because it knows it really doesn’t have to do anything except keep its head down until this passes (like gun control, Gitmo, and a litany of other liberal causes abandoned when the next fauxtrage comes about).  You know, at least the Tea Party advocates turned out for rallies.  Digital liberals will just mock Occupy and Anonymous and Like Kony 2012 and anti-NSA causes on Facebook, slacktivism at its finest.

There’s absolutely no informed debate about this issue at all, yet it permeates every damn site right now.  So frustrating.  I would maintain that you can have 3 legitimate stances on it: 1) you don’t care, 2) you delete all your social data online and encrypt all your email along with friends who agree to it, or 3) you try to see the issue as a balance between national security, technological advancement, and public freedoms.  I choose #3 as a matter of pragmatism.  But I respect those who choose #1 and #2 as well.  I also allow for the criticism of being more open, which Jaron Lanier partially explains:

Metadata has proven to be a tool for certain kinds of behavioral change. Facebook can use metadata to find people who are more likely to agree to share information with each other, because they share history with each other anyway. This, in turn, increases the amount of metadata available to the algorithms. Once enough people are signed up, a new sphere of social mores is created and even more information is shared. … Young people, weaned on free Internet services that spy on them, seem to have accepted an America in which their financial prospects are reduced, and in which no one should expect “privacy.” The acquiescence of our young people is historically exceptional and bizarre. In the metadata age, privacy needs a new definition, and it might be “freedom from being profiled.” Or “equity with those who use the biggest computers.”

So in short: I wish there were more people clamoring for more openness, more transparency, starting with our own personal data.  If agencies and corporations draw power from controlling the distribution of our data, then we need to dump it out there into the public domain.  Aren’t open sourcing, transparency, openness, public domain the things digital liberals and other civil libertarian groups always say they want?

Well, as my final point, I would argue that those values are not really what they want.  They want everyone else to share more, but they won’t do it themselves.  Other people can fight the war, they’ll stay home and watch the Daily Show “destroy” some FOXNews pundit.  Other people can put the leg work in, they’ll make sure to catch that sweet rooftop party tonight.  Other people can dirty their hands with campaigning and fighting for causes, they’ll just photograph it to feel like they’re a part of it.  No associations, no taking a stand.  Just criticizing, critiquing, “doing no harm”.  Useless.

Tech Fetishism

At the same time, the obsession over drones, NSA surveillance, and other aspects of the “military-industrial complex” borders on tech-fetishism.  Behold the awesomeness of that drone turning that pickup truck into glowing-white heat signatures.  Think of the sexiness of that NSA terminal poring a search query through petabytes of data!  Are you getting a boner yet?  It plays into every Ayn Rand teen’s wet dream about how insidious and dangerous the government is, yet it’s ignorant of the reality of today’s world, where columns of tanks and infantry are so rarely seen, but code — and data — runs 24 hours a day, every day.  The thing about that is, tanks and infantry always cause destruction — they were built to destroy — whereas code can be good or bad, depending on the policy and the actors behind it.  Anti-NSA tech-fetishists would have the code and tech destroyed, while in awe of it, but a more sensible approach would be for a citizenry to push a responsible use of that tech through Congress and POTUS: acknowledge the necessity of it, yet create sound policy to govern the use of it.

And a nation won’t use it as much if the nation’s priorities don’t require so much of it.  Right now under a paranoid post 9/11 security apparatus (worldwide and even in the holier-than-thou Europe, I might add, and not just under Nobama’s America), the threat vector includes just about any potential self-radicalizing self-pitying dumbass who read a pamphlet about how x or y is oppressing z.  So you take away the siloed cartel control of distribution of our data, establish reputations and publicize them, and you take away much of the potential for abuse by over-zealous states who either through blunder or through antipathy go after non-targets and then claim confidentiality and parallel construction (a technique as old as the hills by any type of law enforcement, I might add) as a defense.

I don’t know where the fuck this post is ending :) so I’ll wrap it up here but right now there’s some sort of weird disconnect between the reality of a world I thought we all witnessed in the last decade or so and the Sesame Street world that the old Tea Partiers, anti-NSA libertarianers, and uninformed liberals are living in.

And so it will continue.  Sigh.

Opening Up Galapag.us for Alpha

My thesis project for NYU-ITP has been Galapag.us, a tribe and ecosystem for promoting the idea that we should be radically open and transparent with our data so that we can form and share metrics to measure our progress and success in different areas of our lives.  More info at the front page of Galapag.us.

User Zero

I came up with the idea in 2006.  An email I sent to my Army buddy in April, 2006:

I sort of had an idea but it seems like it’ll be difficult to build out.  My idea would be for something similar to Xbox Live’s ranking system.  Except it’s for your life.  Privacy issues aside, people would volunteer to put in as much personal info as they want.  At first it might seem cumbersome putting in so much info but I think as myspace and other services have shown, people are willing to do it if it means it cultivates their identity.

So for instance you put in your income and number of kids and connect your accounts for online game rankings (like in Halo or Battlefield 2) and your exercise plan and your birthdate and your finances and investments and how many web sites you’re on (like myspace, digg, yahoo, etc.) and from all that data, the company would generate statistics that break down your life and give you info about how much time you spend on certain tasks, how efficient you are with your money, what your online reputation is.  Stuff like that.  The core would be statistics…anonymous statistics I think so people won’t have any incentive to forge their results.  The point would be to turn peoples’ lives into a numeric game where they can see how they rate in certain aspects of their lives.  Think of all those online quizzes people take about what kind of lover they are or what their personality is.  That could be tabulated into the statistics, which could be searchable or broke down any way the person wanted.

At the end of a year, we could look internally at our statistics and go visit the top overall people in person to go verify their data and videotape their lives, interview them.  Then a winner would be announced…like the best person award.  Heh…there’d be so much controversy and whining and competition if it caught on.  Then we could write a book about our experiences going out and discovering what makes someone “the best” compared to everyone else.

So…that’s my idea so far.  Sort of like a real-life RPG.  Perhaps we could offer points for real-world scavenger hunts or traveling to different countries around the globe.  What about having life coaches for certain segments, if someone was weak in an area like professional development?  I was thinking we could also offer points for accomplishing certain tasks like humanitarian work.

A lot of stuff happened in the meantime: I got out of the Army, went to study foreign policy in DC, worked for Homeland Security, moved to NYC for school.  And so now I’m wrapping up the thesis, which allowed me more than a semester to work just about full-time (including any waking moment) on trying to make Galapag.us a reality before I can either A) get funding or B) get an engineer/developer job after school.

So I present Galapag.us for thesis on May 15 at NYU.  I have two weeks still to work on it before then.  I think I’ve gotten it to a point where I can start letting alpha testers in to explore, and think about it.  My work log has been tracked on the thesis blog.

Beginning Alpha Testing with Thesis

Want to help alpha test or just look around?  Give it a try at https://galapag.us/login and see what you think!

Here’s the slide deck I’ll be presenting at thesis:

Stack

  • Amazon EC2 small instance with ubuntu
  • node.js/express.js: So easy to build a site using this framework.
  • varnish/nginx+ngx_pagespeed: Caching, run-time optimizations for faster page loads/downloads.  Routes to https and socket.io server too.
  • python scripts for maintaining server default state
  • celery for queuing
  • redis for temporary data dumps and lookups
  • mongodb for permanent data storage
  • angularjs for the comment system
  • mocha, unittest, qunit for unit testing in python and javascript

 

I know the site’s confusing — like an airplane pilot dashboard.  It’ll become more cohesive over time.  A lot of things aren’t quite working yet, or they have filler data to get them going.  Apologies for that.  For more familiarization, try the welcome demo.

But here are some features that are worth checking out:

Comment System

Comments will be available for tribe forums, formula critiques, peoples’ profiles.  I decided to use angularjs so I could learn how to build SPAs with it!

ss_comments

 

Tribes

By tracking individual data, one can also track internal company metrics and state-level happiness metrics too!

ss_graph

 

The Islands

Each island has its own weather, environment, and bonuses/penalties for certain user behavior, so it benefits you to live on the island that incorporates your style best.

ss_islands

 

Professions and Skills

What does it mean to be “good” at something? Are companies hiring the most qualified candidates? How do we standardize that?

ss_professions

 

Your Genome

A profile for your data.  You get reputation scores in different areas.  Those scores are determined by which formulas you choose to use.  You can also see your internet of things (devices, pets, objects) is on the bottom right, while you’ll also be able to create gaming characters using your own data.

ss_profile

 

Quests

You can complete quests within Galapag.us to gain experience.  Some tasks will be data-gardening for other people, some will be to introduce gaming elements, others will be to visit lesser-seen parts of the site.  But mostly the quests should be geared towards helping others.

ss_quests

 

Status Bar

I love github’s command bar. I want users to be able to do most everything through the search bar.

ss_searchbar

 

Tribes and Their Genomes

Tribes are important to our identities. formulas serve as their DNA.

ss_tribes

 

Universal Reputation Lookup

The left-side widget can be opened on most pages to see what reputations the people named on them have.  I intend to allow people to look up reputations from just about anywhere.

ss_widget

 

 

API/Sandbox

Galapag.us will have an API to access one’s data, as well as common stats such as state population census results, zodiac signs, and global stats.  Plus a place to test the routes, within the sandbox:

ss_api

 

So with all that, please go help alpha test at https://galapag.us/login to begin your exploration of identity and reputation.  Thanks, and come to the ITP Spring Show if you can!

Nature of Code Final: Genetic Crossings

Professor Daniel Shiffman’s Nature of Code is outstanding.  Just check out the syllabus. And play with the Nature of Code repo Processing sketches hosted on Github. And be sure to get his book when it comes out! We covered some basic algorithms for simulating inside the Processing environment vectors and forces/repellers, genetical algorithms, Wolfram cellular automata, neural networks, autonomous agents, flocking behavior, particle systems.

Background

For me, the pull towards genetic algorithms, heredity, fitness, evolution, Punnett squares, etc. was great, so my project for my first intro to computational media class turned into my Nature of Code final.

My "EUDAIMONIA" Tattoo

My Genetic Crossings project attempts to create a simulated environment where people exist within a world connected to God, the peoples’ religions, their nationalities, and each other.  They produce offspring based on characteristic attraction rules (for my demo I only used “appearance”, “money”, and “religion”, but only to demonstrate what was possible –I would like to create a more fully-formed algorithm for my personal reputation/identity ecosystem Galapag.us to approximate and adjust to the infinite ways that people become attracted to each other and become married or have children or devote themselves to the other), and they can die.  Their well-being or happiness (what in Galapag.us will be eudaimonia) is dependent on their quality of living within their religions and nations.

Map View

A video from an older version:

See previous documentation on this project:

 

Here are the initial characteristics I created for each person.  There are so many more yet to add! Strength, intelligence, wisdom, charisma, stamina, wit, humor, education, creativity, responsibility, discipline, honesty, religiosity, entrepreneurialism, appearance, money, gracefulness, stress, health, luck, talent_math, talent_art, talent_sports.

Initial nationalities/regions: USA, China, EU, Africa, South America.  Characteristics of security, innovation, job opportunity, immigration policy, life expectancy, education, sanitation, standard of living, pollution, biodiversity, crime, political freedom, and nutrition.  By no means comprehensive.

Initial religions/spiritualities: Christianity, Judaism, Islam, Taoism, Confucianism, Hinduism, Buddhism.  With characteristics of commercialism, morality, hierarchy, portability.  Obviously these need some tightening up/additions/discarding.

Final Project

So in my midterm I managed to add Verlet 2D physics to the sketch so that people, nations, and religions have connections to each other which make them bounce around like they’re on springs, relative to their attractions and strength of ties to each other.

In my final proposal, I sought to add the following:

  1. Wolfram cellular automata
  2. Connect to external database
  3. A selection algorithm to choose certain parts from parents based on mutation rate and fitness to pass along to new offspring
  4. Interaction sliders to change variables
  5. Macro events that affect well-being of all objects in the world, such as earthquakes or war
  6. Micro events that affect individual well-being, like rites of passage
  7. Discrete clusters of people, mostly based on familial strength of ties, instead of one big clump of people in the middle like in my midterm

 

I managed to get most of this done.

I enjoyed adding Wolfram CA.  I wrote a node.js app for express which would act as a JSON middleman between my main genetic crossings sketch and a wolfram sketch.  Basically, when viewing the chromosomal stainings (genotypes), you can click on the CA button to the left of a person’s staining, and this will pass a JSON object (using Prof. John Schimmel’s Processing-Nodejs code) to the node server, which is detected within 5 seconds by a polling timer within the wolfram sketch.  The wolfram sketch then uses the JSON object as its data to apply rules to to construct a pattern unique to the selected person’s genetic characteristic code.

1) I added a third parameter to the rules which would display as either black or aqua, depending on the CA rules.  Prof. Shiffman’s code used base-2 groups of 3, which had 2^3, or 8 total possible combinations (using only the digits 0 and 1), but I used base-3 (0 = white, 1 = black, 2 = aqua), so it became 3^3, or 27 possible combinations.  For this ruleset, I duplicated Wolfram rule 90 three times, then added a few extra codes.  The triangular look seemed the most visually interesting for what I was doing.  Anyway, what was cool about Prof. Shiffman’s code was that it keeps streaming the pattern from bottom to top.  So when a new person is clicked on, that person’s signature is integrated into the flow seamlessly once the sketch loads the JSON off the node server.  I don’t know that any of this actually is useful except that it looks cool and uses principles from class and maybe, just maybe, shows someone’s digital characteristic “signature”.

Streaming Wolfram CA on top of Processing sketch code. Console of Processing shows a passed JSON object.

2) I’m happy I was able to set up a MongoDB to be accessed via node as well as by my Processing sketches.  When I build out Galapag.us, I’ll be able to pump out JSON objects of actual users into these sketches for data visualization.  I’d been wanting to do this since my first semester and now it’s done.  Most credit goes to John Schimmel though for writing the hook into node though!

node.js instance output including passed JSON object

3) I realized that I already had some mutation within my matingDance.sex() function, once the two parents’ characteristics were passed to a matingDance.punnettSquare() function.  Before, the function would just average the two parents’ characteristic values together and then add or subtract a random amount from them for mutation.  What I changed was making the function choose randomly from either parent’s base characteristic.  So if one parent had 10, and the other had 1, the result would not be 5 (rough average) but either 1 or 10.  Then I would offset a random amount (hardcoded as 4) if mutation kicked in (if a random number between 0 and 50 was less than 2, for approximately a 1 in 25 chance of mutation per characteristic).  What this ended up doing was increase the diversity within the genepool and more accurately reflect reproduction.  I still need to tweak these numbers to get more consistent levels of variety but the algorithm is mostly there.

Here’s a view of the chromosomal stainings before I changed the algorithm — here it averaged the parents’ traits, which, in the case of this sketch’s iteration’s octomom, created many extremely similar offspring:

Before

And here’s the view after picking from either parent and allowing for a slim chance of mutation:

After

I feel as though the end result has a more diversified population with more variability between generations and individuals.  I need to tweak this so that if the value from a parent is at 1 or 10, it may mutate in only one direction, but here’s the matingDance.punnettSquare() function:

int punnettSquare(int comp1, int comp2) {
    int mutation = (int)random(0, 50);
    int dominance = floor(random(0, 1.99));
    int crossover = 0;
    if (dominance == 0) {
      crossover = comp1;
    }
    else {
      crossover = comp2;
    }
    if (mutation < 2) {
      crossover += (int)random(-4, 4);
    }
    // don't want it to be out of bounds
    // TODO: fix so it can mutate only one way if parent is 1 or 10
    if (crossover < 1) { crossover = 1; } else if (crossover > 10) { crossover = 10; }
    return crossover;
  }

4) I didn’t add sliders to change variables mid-sketch — at this point I can use variables pre-set in the main class but I’d like to make the interface more user-friendly and interactive later.

5 and 6) I didn’t do macro and micro events because I figured they’d just require making a button that, when pressed, would cause particles’ values to change.  What would be interesting would be to have random events happen based on their likelihood to occur and then some events would have permanent effects (damage to peoples’ personalities) or temporary effects (nationalities’ well-being that would later recover).  This kind of introduces the possibility for individual peoples’ health and whether they have injuries/disabilities/diseases/gifts/talents.

I did add a Ritual class though, which only includes right now a funeral function.  When funerals are recognized by a culture (by pressing ‘f’), the dead are removed from view on the map and their attraction springs are removed as well.  What this is supposed to represent is that funerals are a way for the living to remember the dead and then put them to rest so that the living can move on and create new ties with the living.  I do like the idea that we retain our ties to the past, which can sometimes become weaker in death and sometimes become even stronger.  I didn’t model that yet.

public class Rituals {

  Rituals() {
  }

  void funeral(boolean funeralsRecognized) {
    println(funeralsRecognized);
    for (int i=0; i<numPeople; i++) {
      if (person[i].parent1 != -1 && person[i].parent2 != -1 && person[i].alive == false) {
        if (funeralsRecognized == true) {
          physics.removeSpring(parentSpringArray.get(person[i].parent1Spring));
          physics.removeSpring(parentSpringArray.get(person[i].parent2Spring));
          physics.removeSpring(parentMinDistanceSpringArray.get(person[i].parent1MinDistanceSpring));
          physics.removeSpring(parentMinDistanceSpringArray.get(person[i].parent2MinDistanceSpring));
          person[i].lock();
          person[i].display(0);
        }
        else { // TODO: re-reference spring after it's recreated?
          parentSpringArray.add(new VerletConstrainedSpring2D(person[i], person[person[i].parent1], person[i].parent1RL, random(parentGravity1, parentGravity2)));
          person[i].parent1Spring = parentSpringArray.size()-1;
          physics.addSpring(parentSpringArray.get(parentSpringArray.size()-1));
          parentSpringArray.add(new VerletConstrainedSpring2D(person[i], person[person[i].parent2], person[i].parent2RL, random(parentGravity1, parentGravity2)));
          person[i].parent2Spring = parentSpringArray.size()-1;
          physics.addSpring(parentSpringArray.get(parentSpringArray.size()-1));
          parentMinDistanceSpringArray.add(new VerletMinDistanceSpring2D(person[i], person[person[i].parent1], random(parentMinDistanceRL1, parentMinDistanceRL2), random(parentGravity1, parentGravity2)));
          physics.addSpring(parentMinDistanceSpringArray.get(parentMinDistanceSpringArray.size()-1));
          parentMinDistanceSpringArray.add(new VerletMinDistanceSpring2D(person[i], person[person[i].parent2], random(parentMinDistanceRL1, parentMinDistanceRL2), random(parentGravity1, parentGravity2)));
          physics.addSpring(parentMinDistanceSpringArray.get(parentMinDistanceSpringArray.size()-1));
          person[i].unlock();
          person[i].display(1);
        }
      }
    }
  }
}

7) Discrete clusters.  I ended up adding relationships between people and their parents from just constrained springs to a combination of constrained springs and minimum distance springs.  What this would change is that a person’s distance from his parents is both constrained to no more than a certain length but also more than a minimum length, so that they can both be more visible instead of overlapping visually, and also be more clustered together.  I found that this makes certain groups on the map appear more clustered instead of forming a big ball in the middle.  I still need to do more work on this though because as there are more people in the sketch, the big clusterfuck returns (because there are too many connections between everything and I can’t zoom in closer to see the gaps and relative spacing between different networks).

I converted a lot of my arrays of spring connections over to one large ArrayList, which I think was easier to deal with in the end in terms of manipulating them after they were initiated into the environment.  I did find, however, that I had to pass a reference to the spring’s number (since it was just an ArrayList entry) to the person’s class instance so it could refer to it later.  A problem with this though, as I realize just now, is that if I remove springs (as I do in the funeral ritual), I’ll lose the correct references.  So I have to make sure that when the springs are added again, when funerals are disabled, that a pass a new reference to the ArrayList.

I also found that there tends to be super-breeders every time I run the sketch, with certain people tending to produce tons of offspring while others produce none.  I’m talking like 1 or 2 people will produce 10 kids, which tends to make the sketch appear too tightly clustered because everyone is closely linked.  Perhaps this is a feature, rather than a bug, of reproduction?

Code

You can download the code from Github.  You’ll probably want to start up a node instance and then start the genetic crossings sketch, then finally the wolfram sketch.  Instructions are in the README.md.

Github: https://github.com/Xeus/Genetic-Crossing

Conclusion

And this leads me to some closing notes. I shied away from adding fitness yet again to my reproduction algorithms because I felt like “fitness” in the short-term was too much like large-scale evolution theory and autonomous agent simulation.  In my sketch there wasn’t really an ideal fitness state, with no limitations or rules imposed on the larger scale.  What I wanted was to break into modeling some culture into the simulation, so that choices were made between sexual partners based on cultural norms and not as much on randomized reproduction. Obviously modeling culture would work best if it were overlaid on top of basic biological reproductive theory such as choosing the fittest partner and whatnot, but I felt that was too much for the scope of this simulation, which I wanted mainly to focus on social networks.

JavaScript has come a long way.  It’s now the same on the backend and the frontend.  Processing can be exported to JavaScript in some capacity, and dataviz libraries such as D3 are taking off.  Soon we will be able to introduce more fluid, data, physics, and particle system simulations within a browser.  It’s too early for my sketch yet (ToxicLibs takes some finagling) but this is a glimpse of the web to come.

As I begin to do more serious work on the internal mechanics of Galapag.us, it’s stuff like this Processing project that makes me appreciate how careful I’ll have to be with positioning different factors against each other so that people can create their own formulae/evolutions to weight different priorities how they deem fit.

Looks like this book out of the Harvard Berkman Center, “Interop: The Promise and Perils of Highly Interconnected Systems”, by John Palfrey and Urs Gasser, is a must-read.

What I do feel is that current online social networks have not really tried to map out the complex interweaving, competing, variable connections and attractions we have between ourselves and others, between the different identities we all have, between the things we care about more or less at different times in our lives, etc.  To facilitate something like this, I can’t help but feel there needs to be a massive API that allows people to access all this data (if privacy settings allow it) so that we can take advantage of the multi-dimensional nature of our species.

You can think of someone’s identity as a meshed web that is being pulled apart by the external world and people and ideas and being pulled together by muscle and ligament and cartilage and sense of self and personality and such.  You can think of a community as a bunch of these springy people pulling on and apart from each other constantly, but at a stronger tension than from other communities.  Communities form religions and nations and cultures, again with that same network of relationships and competing identities. I hope that’s the dynamic I was able to capture in doing this project.

Credit

Special thanks to:

  • Prof. Dan Shiffman for all his documentation and code from Nature of Code, particularly his chapters on forces, genetic algorithms, ToxicLibs, and cellular automata
  • Prof. John Schimmel for his Processing-Nodejs code

AdjectApproval

Over the break, I had some free time to build a quick site called AdjectApproval, a play on the phrase “abject disapproval”.  Instead of the connotation of something very sternly and harshly offensive, AdjectApproval plays on the phrase as finding approval and verification and identity using adjectives and descriptors.

When you go to AdjectApproval, you’re prompted with a list of descriptors and then must guess what you think those words are referring to.  Do they describe a person, a brand, a company, or what?  There is a hint button, which will give you the tribe and gender of the unknown object, if available.

If a set of adjectives seems to yield correct answers often, then we can assume that they’re more useful than a set that yields incorrect answers.  But then you should be able to add more adjectives if you guess wrong, and this should improve accuracy over time.

You can also look in the left column, where you can add your own people or things.  There’s a list of random current events names and personalities that you can enter adjectives for, as well.  If you click on “full list of descriptions” at the top, that page will show you everything that’s been added to the database.

Eventually I want to track which adjectives are used to describe men, women, and brands, and pull some natural language processing on that stuff.

Basically AdjectApproval was intended to experiment with the problem we have when we can’t remember someone’s name, or when we have to describe someone to someone else.  What words do we use to describe someone as efficiently as possible, so we’re not stuck explaining who the person is for twenty minutes?  What words would immediately cause someone to say, “OH!  You mean so-and-so!”?

I was also interested in this because, just as Galapag.us attempts to quantify and qualify peoples’ identities, I think there’s a massive disconnect between how people perceive themselves and how both those close to them, and complete strangers perceive them.  The measurement of the difference between these perceptions is the margin of error, or the variability of someone’s perceived character.  This margin can be used by some people to steal and lie and cheat.  This margin can also be the cause of severe insecurity of people in social settings, as they perceive everyone to be judging them, when in fact other people may not even be thinking about them at all.  This margin fascinates me.

In the course of building the small project, I realized that the most useful descriptors are often the most socially offensive.  This seems interesting because it suggests that we will censor our descriptions of the world if we are in company where it might offend.  Describing someone as “fat” or “anorexic” or “ugly” or “hook-nosed” or “cankles” is really offensive in most company, but it might cause someone, who knows which tribe or social group this person is a member of, to guess the right person immediately!  Would we be better-served if we were just brutally honest about our perspectives?  Or is this a price too large to bear compared to the benefits of social niceties?

I also learned that adjectives are too confining; we often can describe people in multiple ways: nicknames, profession, catchphrases, their favorite possessions, their familial links, names of things they’ve created, etc.  This seems to invite more of a vocabulary of marketing and branding, since you’re basically dealing with building a brand, or using something like the literary device of metonymy. (e.g. “The White House” as metonymy for the executive branch of the federal government, or for the President)

I built AdjectApproval using PHP, MySQL, jQuery, and jQueryUI.  It’s definitely not bug-free and I’m going to have to restructure the CSS and make it far more intuitive, with better guidance and feedback messages.  The styling is pretty poor and inconsistent.

Random School Break Thoughts

Real Relationships

Keeping up with friends for me has become a matter of remembering which method of communication they prefer.  Having moved from place to place and from tribe to tribe, I know quite a lot of very differently raised and educated and geolocated people.  All of them have their own quirks when it comes to social networking.

I, being what you might call a digital native, am pretty comfortable with just about any method of communication, though strangely I hate online one-on-one chat the most (it requires far too much focus).  But some friends only respond to phone calls, some are happy with email, others only seem to check Facebook (presumably because their email accounts are so packed with junk), some I only know through IRC or Twitter or meeting at conferences.  Over time people I sort of remember from high school have joined Facebook — my generation was just a little too young for Generation X and just a little too old for Generation Y, so some prefer to be more X and write off social networking, while some of the more online-savvy made the transition much sooner.  My Georgetown international affairs friends are very social networky but in a tech-deficient kind of way.  They do happy hours a LOT (a VERY DC thing), they are very comfortable writing emails (their jobs almost always include writing a lot), and they’re of course very up on current events, but ask them to do much more than open a web page and they’re clueless and obstinate (it comes with their territory, IR people overvalue their intelligence).  My NYU-ITP friends are the most tech-savvy of all, as a lot of them are partially coders and grew up like me: finding themselves online.

The most annoying thing to me ever is people who say they don’t use social networks because they prefer “real” relationships, whatever that means.  I think what it’s code for is that they don’t have the bandwidth to spend online cultivating their social networks, so they prefer to focus their attention in meeting up with people who live near them.  Which is fine.  But they should just say that.

What’s funny is that my Army and military friends are the most straight-up about that.  My Army buddies will say about social networking, “That’s all just a bunch of horse shit.”  And I’m happy with that.  They make no bones about it.  They are the least-wired people I know, which is sort of scary in some ways because in the 21st century, the soldier will rely more and more on communications breakthroughs to not only transmit squad movements but also to control the robotic drone armies of the future.  In other ways it’s good though, because all those soldier hicks from the backwoods will still know hunting, tracking, being-outside skills that the city slickers have long since lost.  They are also more warm, more open, and more inviting to outsiders than other people I’ve met.

After 5 years in the Army, I definitely came to admire and enjoy being around the hicks who want nothing more in life than retire to the back 40 to a big house way out in the countryside and live out their days hunting deer and working on the house and shooting the shit.  Those guys had some sort of weird magic that made them inept in urban environments but keen and sharp when out in the desert or in the woods dealing with the harshness of nature.  Anyway, you can always count on servicemembers to give it to you straight.  It’s such a rare thing to find outside of the military.

So as for “real” relationships, active avoiders are the hardest for me to maintain relationships with.  They have no footprint online and barely know how to make their phones work, and they refuse to try.  News about related friends is almost always news to them, and it has deeply stifled my ability to keep up with them.  Is this a real relationship?  If anything, I feel like I put in more work for “real” relationships, tracking people down and trying to meet up with them when I can, despite few coming calling for me when they might be in my town or whatever.  Few people put in real effort.

From a broader perspective, is there terminology for the skills that humans are evolving regarding social networks?  What do you call it when you have to juggle how to get in touch with your friends, over which networks, via which mediums?  Organizing a happy hour or party involves sending invitations through different methods: some snail mail, some via Facebook, opening a Facebook event, calling the rest.  It’s like the lighting of bonfires from mountaintop to mountaintop in Lord of the Rings.  It’s like riding through the streets of New England to warn of the Redcoats.  It requires people who are willing to pull together disparate groups and who know all those people well enough to remember how those respondents receive word best.  Is this politicking?  Is it curating?  What is it?

Final note.  I found David Sasaki (@oso)’s post on Time’s Protester as the Man of the Year, protest infatuation, and the fourth wave of democratization (hello Huntington!) to be superb, and somewhat relevant to my above expounding.

What Annoys Me About Going to Basketball Games

I went to the Denver Nuggets vs. Dallas Mavericks game on Boxing Day, courtesy of my dad’s astute Christmas gift.  I also had season tickets for the Washington Wizards last season, which I deeply enjoyed. I’ve definitely deepened my appreciation and love for basketball in the last couple of years.  I owe a lot of that to my main man and longtime Army buddy MonkeyPope.  You should see the great email discussions we’ve had about unlocking formulas for winning basketball using Moneyball-ish statistics.

Anyway.  It always pisses me off how all the promotional shit they do during basketball games only reaches the front rows.  The free t-shirt tosses, the Chipotle burritos, the camera close-ups?  Always the first 20 rows or so.  The upper decks, where us hoi polloi watch the game from, are ignored.  We don’t put down the serious money to sit closer, true, but if I were a team owner, I would think it’d be a small price to pay to endear your team to those upper-deck folks who just want a little attention, a little special feeling for that one basketball game they get to enjoy every few years.

This is all made worse by the fact that sporting events, particularly the popular and cool ones, support a top-heavy system where the richest get the best seats.  And the richest are weakly correlated (I would imagine) with the most passionate of fans.  So the people closest to the court, the people whom everyone cues off of for excitement, are the people least invested in being crazy fans, being caring fans, hell, even being the attending fans.  Like at the US Open, where the front rows are often empty up until late in the second week of the tournament, because the rich people who bought the tickets can’t be troubled to sit in the sun all day.  Good Heavens, where are my umbrella and my palm frond-waving servant?

What you get is boring sporting events until the playoffs.  And this is solely because the rich folks who wear suits to the game don’t give a shit.  Seriously, MonkeyPope and I bought tickets for one game where we sat right behind the scorer’s table, and we loved every single second of it.  All the players’ expressions, all the on-court chatter, everything.  We could see it.  But we sat next to a couple douche bros in suits and an old couple.  All the other seats were empty.  And we had to show our tickets to the attendants all the time because they didn’t believe we should be there.  There were no mad fans hooting and hollering and cheering.

There’s a reason small venues for concerts work, and why college basketball is more rowdy.  The people who care the most are part of the center of attention, near the stage.  In small venues’ cases, there are no seats, so whomever pushes their way up to the front wins.  In college basketball, the students get the premium seats on each end.

Compare with seated concerts where you get most people uncomfortably lodged into small aircraft-like seats with just a few drunk cougars swaying back and forth.

Also, this has happened to me quite a bit now, I keep running into friends who have always benefited from being well-connected, and when we realize we went to the same basketball game, I tell them I sat up near the top, while inexplicably their friend had front-row seats.  And none of them give a shit about basketball!  It’s so infuriating on different levels.  Not that I’m mad at my friends — I’m happy for them — but from a basketball gods/eternal court of justice perspective, it’s unfair.  And I know the basketball gods exist because they helped the Mavericks defeat the Heat, an epic battle between good and evil.

I will also add that I hate how basketball games always try to pimp their grub, gear, and beer.  As if when you were sitting in your seat, you forgot that maybe you wanted a beer.  Right, how many guys forget they want a beer?  Have they done studies on how a scoreboard screen ad for Bud increases sales?  It’s even worse for hoodies and cheap screenprinted t-shirts.

Basketball games (and most sporting events) really do not exploit their cheerleaders enough.  Seriously, sometimes the best part of a basketball game is the two times the cheerleading squads come out and do their ridiculous dances.  I know it’s silly but everyone is transfixed on the ladies.  MonkeyPope and I seriously contemplated buying tickets by the corners so we could sit in front of the cheerleaders.

This probably goes hand-in-hand with the dumbass family-oriented goals of the owners.  They try to tone down the violence, sex, and testosterone of sports by inviting Nickelback to play halftime, by promoting Monday Night Football and the NBA Playoffs with Justin Bieber and other sexless safe acts for kids.  David Stern’s move to ban thug gear, which was massively unpopular at first but which has led to innovative fashion trends of NBA players dressing up in pretty awesome suits and nerd-gear, was an offshoot of trying to make sporting events more family-friendly.

But going to a basketball game is like seeing big cats at a zoo.  I hate cheap fouls and violent players, but I want hard play and emotive players.  They’ve tried to temper all of that.  And the setting is so neutered that it’s not the raw power that basketball normally is, anymore, until maybe the playoffs when there’s just too much energy in the crowd and in the players to control.  Compare public-event basketball to streetball — in streetball, there’s no people helicoptering around fining you for not playing nice.  It’s a more raw game.

New Year’s Resolutions

I’ve resolved to spend the entire year thinking of gifts for people.  I’m definitely not happy with how I show appreciation to people I care about by the end of the year.  Gift-giving as an art is something I’ve observed in my brother, who picks amazing gifts.  It usually doesn’t require spending a lot of money, but it requires good timing (seeing something unique at the right time and springing upon it), and it requires understanding the recipient and realizing what his/her interests are and what your relationship to him/her is.  I’ve always sucked at it and it’s become almost paralyzing for me to come up with gifts.

The argument of course can be made that gifts do not matter because they are material things.  This is true but my other limitation is money.  To be honest, if I had the money, I would throw events for my family and friends often, in remote places, to get them out of the lives they’re stuck in temporarily, to share common time with them in a different environment for relaxation and bonding.  Maybe this says more about me than what my friends and family want.  Because I think the gifts that I’ve come to really appreciate as I get older are, weirdly, bottles of hard liquor (given by my buddy Mat after I helped him move some stuff) and access to events (like my dad’s tickets, or my classmate and friend Ann who had me over for Thanksgiving).

I’ve taken to trying to write full breakdowns of my relationships to certain people in an effort to remember those intricacies and delicacies of the nature of my connection to them.  It’s a sign of my growing admiration for biographers, who often write more fascinating stories — those of the people behind great products, events, and breakthroughs — than the things they made themselves.  But it’s also a sign to me that one of my defining traits has been observation and love of people (hence my love for F. Scott Fitzgerald’s insights on human personalities and behaviors and quirks).

So to be a better gift-giver is not to buy more expensive shit for people, but to appreciate my relationship with them more.

Other resolutions: learn morse (I’m about 20 letters in, so that’s getting there already), learn surfing, visit the Galapagos (I have the free miles), and get better at basketball (going to need a good coach for that).