MettaProgramming

Thoughts on Software and Technology

A Farewell to Facebook, Reason #2: Interaction

leave a comment

This entry is part 2 of 2 in the series A Farewell To Facebook

In a previous post, I described the confusion of the term “friend” as a primary reason I left Facebook. Another reason I left was confusion over the term “interact.”

It just seems that much of Facebook is not “interaction.” It’s short anecdotes that people comment on. That’s not interaction. Interaction is real conversation with someone, where you learn about what’s going on in their lives, in their head. More importantly, interaction is where you learn what’s going on in your own head.

It’s growing, it’s changing, it’s becoming. It’s not talking about your cat and having someone else comment on it.

But that’s what I kept feeling. I felt as though we’d all sit with our Facebook comments and think that we’d really interacted with someone because we read about them being sick, or read about them mowing the lawn. I’d see people that I hadn’t seen for some time, and they’d start talking about things that happened a couple weeks ago that they’d read about on my Facebook page. Most of the time, this would not be comfortable- not because I was uncomfortable with them knowing details of my life, but because they didn’t know details about my life.

When someone reads a quick Facebook post about something anecdotal that happened in someone’s life, all they have is an anecdote about what happened. They don’t have the story, they have a soundbite. They just have a meaningless quip, because they haven’t actually interacted with the person, with the information.

This is especially true for me and my information. Since I felt that way about Facebook– that it’s not real interaction– I would liberally sprinkle my anecdotes with comedy, or spice them up to make them much more funny than they’d otherwise be.

Rate these two possible Facebook posts for comic value:

I didn’t feel too hot this morning, but after I ate breakfast, I felt a little better.
While sickness sucks in general, throwing up immediately after breakfast is a surprisingly effective weight loss strategy

See? Number one is boring. I generally shy away from boring– or at least things that make me feel like I’m being boring. So I’d… embellish a bit… and add some comedy… because really, it’s Facebook, no-one’s going to actually take it seriously, right?

Wrong. I’d see someone and they’d start talking about what’s going on in my life as if they know about it, and I would often think “Eh, yeah. Uh, so, that’s not even really close to what’s going on. You take Facebook seriously, don’t you?”

After enough of these interaction, I start thinking that either a) I need to start taking Facebook seriously too, or b) this is not the best place for my type of semi-realistic humor.
The joy of rumor

So, one day, my wife, Jessica, get’s a call from her sister saying that shit has hit the fan and she really needs to call her mom.

So she calls her mother, who starts immediately bitching at Jessica for keeping her in the dark and not telling her what’s going on and why does she have to learn about me getting fired by having Jessica’s aunt call to gloat about how maybe her son-in-law is not so great after all and maybe she’ll know what it’s like to have kids who are unemployed and maybe when one of us gets unemployed Jessica could think to call her mother and tell her her mother instead of giving her aunt a reason to call and gloat!

Now, I’m a contractor. I have a small business– me– that provides services to other companies that they cannot provide for themselves– software development. Most of the time, those services eventually, well, end. Not in a bad way, mind you, because hopefully I’ve actually done my job, which is to do something, afterwhich, since there’s nothing else to do, I leave. So, you could say that I am a complete failure unless I leave a job, because if I don’t leave, it’s probably because I never actually finish what I’m supposed to do.

But sometimes– most of the time really– I really like the people I work with, and grow to think of them as friends, and miss them when I’m gone. Also, quite often, I’m not sure about how my work is going to live in the context of the company. Usually, I build something near completion and then the company has to take it and finish it and/or use it. So, because I care about what I make, I worry that it’s good enough, that it lasts, that it solves the problem I wanted to solve.

So, one day, thinking about all of this, I posted something on Facebook:

“Last day on the job. Always a bittersweet experience. Gonna really miss it here and the people, and worried about what’s going to happen next”

This post is read by my wife’s cousin, who apparently tells his mom that I’m leaving my job. His mom, apparently assuming that I’m only leaving because I’ve been fired– which is good because she’s constantly in competition with her sister– i.e. my wife’s mother– so she calls her sister to gloat. This makes Jessica’s mom freak out because her daughter’s husband has been fired, so she naturally calls Jessica’s sisterto freak out and complain about how she’s been left in the dark about me being fired because her daughter doesn’t care to tell her anything.

Jessica’s response to learning all of this was “Huh, what?”
You could just ask, people

Now, admittedly, this isn’t Facebook’s fault. The family political firestorm that swept through Jessica’s family was entirely fed by the dry tinder that is “Jessica’s family members relationships with Jessica’s other family.” Which is to say that it’s basically the norm if not exactly normal. Facebook was, at worst, a match carelessly thrown from a car into a pile of dry grass.

Still, the family is flammable, and so we need to be exceptionally careful with sparks. We, I, need to be ever conscious of my matches. And it’s not just hers. My own family has mis-read sometime comic, sometimes off-color, posts on my Facebook wall and assumed the worst. The thing about all this is that, if it were honestly interaction, then there would be… well… interaction. Think of the two ways the situation above could have been handled:

Freak out and immediately assume the worst. Call all the other members of your family to ensure the firestorm is as big and as violent as possible. Start preparing your daughter’s spare room for her post-divorce life, and prep yourself for your unemployed son-in-law to start borrowing large sums of money and never paying them back
Actually talk to your daughter and find out that they are celebrating over a glass of Oregon Pinot Noir.

One of these really stupid and childish, the other is thoughtful and involves interaction. The thing about Facebook is that it encourages us all to take the stupid and childish path. Facebook does this because it tells us that it is providing interaction- and we all, me included, are dumb enough to believe it.

You see, true interaction would be “call your daughter and find out that everything is fine.” That would be interaction. But Facebook has already provided “interaction.” So we assume that the actual interaction has already taken place, so the next logical step is to freak the fuck out, right?
Another twist

Of course it’s an exaggeration. Just as with Facebook, I’m going for comedy as much as anything. Still, the point remaint, and the point is that if Facebook, as a system, honestly was interaction, freakouts probably wouldn’t occur at all. And if Facebook honestly encouraged interaction, then the freakout would be avoided because we would all… well… interact!

Rather, Facebook encourages us to assume we have the whole story. It encourages us to assume that the soundbite is all the information that we need. This is bad enough, but it’s worse when someone like me doesn’t take it seriously at all, and further obscures reality with comedy and embellishment.

But there’s another twist. Similar to the first. This wasn’t the reason I had for leaving. It wasn’t other people freaking out that caused me to have second thoughts, it was my own change.

I found that I had to be really conscious of what I posted. “Can I post this? Will her family freak out?” “If I post this, can I make it comedic without fallout?” It was becoming troublesome to make sure that what I posted was… safe.

And so I actually swung the other way, purposely posting stuff that was unsafe just because I shouldn’t have to worry about it being safe. I’d post about Jessica walking around wearing nothing but cellophane, not because it has (or ever actually would) happen, but because “dammit, if I have to worry about posting something that might upset her mother, that pisses me off, so I’m going to post something that will surely upset her mother.”

So I went from posting whatever I wanted, to posting only what I thought was safe, to posting what I hoped was unsafe. Which means I went from being angry at other people being stupid to actually being more stupid.

No. Stop. Time to leave.

That’s the real reason. Because, apparently, I don’t have the wisdom and self-control to fight stupidity with integrity. Maybe one day I’ll learn, but until then, I just thought it best for me to go away.

Written by

December 13th, 2011 at 9:15 am

Posted in Miscellany

A Farewell To Facebook, Reason #1: Friends

leave a comment

This entry is part 1 of 2 in the series A Farewell To Facebook

Recently, I deleted my Facebook account.

Deleted. Completely.1 When I did this, many friends and family expressed surprise, sometimes outright frustration, that I would leave Facebook. According to them, there were a number of reason I should not have left, but primary among them was that I’d be eliminating that important way to communicate with me and see what I’m doing.2

I’ve been thinking a lot about writing a “why I’ve left Facebook” post and almost didn’t. After all, I dropped off the radar on a random day, at a random time, without any warning. I wanted a clean break, and writing a “why” isn’t really clean. But, I do want to express my reasons for leaving. They amount to three fundamental things

  1. Confusion over what it means to be a friend
  2. Confusion over what it means to interact.
  3. My own personal tendency to obsess.

Because I’m a loquacious SOB, I decided that each of these warrants it’s own post. Here’s the first.

The meaning of “Friend”

One big reason Facebook drove me crazy is that way too many people just got way too caught up pouring as much emotional meaning into friending as they possibly could. I didn’t see Facebook’s use of “Friend” as meaningful as others did. When I started using Facebook, I made a rule for myself that I’d have no more than 100 “friends.” Why? Because I personally couldn’t honor more than that many people with the real, honest communication that I wanted to.

Now, this is a personal decision, I admit. Many people friend everyone on Facebook and don’t feel they have to “honor” them at all. I may seem ridiculous when I say this, but I truly believe that everything we use, we should use in the way that best supports our own personality and personal growth. Everything we do, we should do mindfully and with intention. For some people, that means friending everyone. That’s fine. My mindful– my personal– decision was to friend a small enough number of people that I could truly interact with them all.

I also made a conscious decision to friend only family, and people whom I actually considered friends in person. People whom I saw regularly, or for whom continuous strong communication was important. If I would regularly go out of my way in everyday life to see you, or to be with you, or to contact you (or you, me) then I’d probably friend you. If I didn’t have that opportunity (because, say, you lived far away), but wanted to, I’d probably friend you. If you lived in the same very small town as me, and I only saw you when we bumped into each other accidentally, then no, I probably won’t friend you.

Again, not the way many others use it, and that’s fine, because that’s the way I, mindfully, intentionally decided to use it in a way that best supported my own personal convictions.

What I found, however, was that people were often offended and angry with me because I didn’t not want to friend them.3 So, I would ignore friend requests from people whom I didn’t actually know, or from people whom I didn’t consider an actual friend, or people who I very occasionally saw around town but whom I never really interacted with. This caused a surprising number of “why won’t you friend me?” problems.

I would also un-friend people whom I had been “friends” with, but whom I had not interacted with. Let’s call this “the normal dissolution of a relationship that’s happened quite naturally for at least 1.5 million years before Facebook existed.” I mean, seriously, I don’t read what you post, you don’t read what I post, yet you’re angry when I suddenly disappear from your stream? (A stream that might be active enough that you can’t actually read what I’m posting anyway).

Then there was what I would call “the regular culling.” I would end up with 150 “friends,” and decided to pare it down to my decided maximum 100. And people got surprisingly angry with my decisions, angry with my reasoning for why I would un-friend them vs. someone else. People would ask other people if I dropped them because of something that they posted that I never even read. It was ridiculous.

Facebook as emotional support mechinism

The result of all my mindful decisions on how I wanted to use Facebook was that I found myself needing to justify my decision on how I would use this piece of software strictly so that I could appease other people’s emotional security. If I un-friended someone, I would often get very stern demands for an explanation of why I unfriended them.

Really? I need to justify myself?

I found myself not wanting to explain, but to shout. Look people, it’s fucking software. It’s a goddamned tool. It’s like a wrench. It’s useful for some forms of communication. You don’t get all sobs and whines when I say I don’t have your phone number, do you? No! You don’t get upset and demand an explanation of my reasoning when I say I lost your email address, do you? No! Why? Because it’s not a statement of your worthiness as a human being for fuck’s sake! It’s a fucking tool!

I used Facebook as a tool. As another in a large suite of communication methodologies which I could use to transmit thoughts and information to and from people with whom I wanted to communicate. It’s nothing more than that, to me.4 I realized however, that to many other people, it was a statement of whether you cared about them as a person, or whether they were good enough, or whether their emotions could handle the personal decisions of other people– decisions which have nothing whatsoever to do with them.

I realized that it often felt like high school all over again. “You don’t want to take 5th period english?! But you know I’m in 5th period english! Did you drop it because you don’t like me?!”

No, I dropped you because I had 120 “friends” and chose 20 almost at random, and you happened to be one of them. Grow up, put on your big-boy panties, and

Get over it.

The truth of Reason #1

But here’s the plot twist at the end of the movie: That’s all bullshit– well, it’s all true, but it’s not the real reason.

I didn’t leave Facebook because because people were being emotionally childish about my arbitrary decisions at all. I left Facebook because I, myself, was becoming caught up in the personal politics. It wasn’t that people were demanding reasoning for my decisions anymore. It was because I, myself, was making decisions based on whether they might demand my reasoning.

I would look at my friend count and see “150″ and think “there are only about 90 that I’d really like to keep, but the other 60 will get grumpy if I un-friend them.” Even worse, I would friend people just because I knew that if I didn’t, there’d be fallout.

Really?

So, I’m all mad at people for playing stupid, emotionally immature political games because of a piece of software, and how do I fight that? I play stupid, emotionally immature political games!

No. Stop. Time to leave.

So, that’s my real, honest Reason #1 for leaving Facebook. Not that other people were being ridiculous, but be I was being ridiculous. It was affecting not only the decisions I made, but it was affecting why I was making decisions.

And I decided that wasn’t positive.

  1. or, as completely as Facebook will delete any account, which is likely not very complete []
  2. This, I state clearly, is patently ridiculous. Twitter, blog, web, I have a rather active internet profile. Google John Metta to see why anyone can get a hold of me, and know almost everything I’m doing in real-time. I suspect that the real reason for any frustration is more honestly that it won’t be as easy to get a hold of me. []
  3. It’s an unfortunate reality that many people on Facebook expect you to use Facebook the way they use Facebook, and if you don’t, then you are #doingitwrong. []
  4. Well, that and a comic platform, but that’s the topic of another post []

Written by

December 12th, 2011 at 10:03 am

Posted in Miscellany

Censorship

leave a comment

Dear friends,

I just emailed Congress to urge them to oppose the Internet Blacklist Legislation, known as the PROTECT-IP Act in the Senate and the Stop Online Piracy Act (SOPA) in the House. This legislation seeks to give the executive branch power to conduct slash-and-burn campaigns against websites that allegedly host – or even link to – content that infringes on intellectual property rights. That would “disappear” whole domain names, fundamentally undermining Internet security, and/or choke off their financial support. The Internet Blacklist Legislation puts more sites than ever at risk, effectively upending the DMCA safe harbors that have been crucial to the growth of Internet innovation and creativity.

Sadly, these short-sighted and dangerous bills won’t do much to stop online infringement – but they will jeopardize our ability to speak and read online with the kind of freedom we cherish in the offline world. Deep-pocketed Hollywood lobbyists are aggressively pushing to control and censor the open Internet, willing to sacrifice free speech and our Internet culture in hopes of controlling how people view their movies and products.

We need to stop this bill before it goes any further. Will you contact your representatives in Congress and urge them to oppose the Internet Blacklist Legislation? Visit: https://eff.org/r.C8A

Written by

November 16th, 2011 at 10:07 am

Posted in Miscellany

Polymorphic :has_many, :through in Rails modules

leave a comment

[Update: Stephan Wehner actually showed me how to get this working (see his branch). Something else was wrong in the program I was actually using, which went away when I built this simplified version- I just never really tested with the simplified version. Thus, this post is now pointless. Thanks Stephan.]

Recently, I had need to create a plugin that held a polymorphic :has_many, :through relationship. I spent a day or so trying to get this to work, only to realize that it is essentially impossible to do inside a pluggable Rails module, but possible if you templatize the classes.

PolymorphicPlugin Example Project

There’s a StackOverflow thread that describes this problem and the solution a bit; however, Based on the difficulty, and the fact that I couldn’t find any documentation specific to this problem, I figured I’d write it up as an example, and create a PolymorphicPlugin gem to illustrate it better.

The PolymorphicPlugin inside-module branch is an example of the way you’d distribute a pluggable Rails module with all classes contained in the module. The generator only creates a migration in the Rails project.

The PolymorphicPlugin outside-module branch is an example of the way you’d distribute a pluggable Rails module in such a way that the generator creates a migration in and also copies model files to the Rails project.

Problem Description

The idea is that there’s an “acts_as” like plugin that I want to add to my Rails models:

module PolymorphicPlugin
  module PolymorphicHolder

    def self.included(base)
      base.extend ClassMethods
    end

    module ClassMethods
      def holds_things
        has_many :thing_groupings, :as => :thingable
        has_many :things, :through => :thing_groupings
        include PolymorphicPlugin::PolymorphicHolder::InstanceMethods
      end
    end

    module InstanceMethods

      def has_things?
        true
      end

    end
  end
end

You can see that anything that calls holds_things should have a :has_many relationship with Thing through the ThingGrouping join table. This is a standard paradigm for a polymorphic :has_many, :through relationship.

Basically, I want to do this:

class User < ActiveRecord::Base
  holds_things
end

class Admin < ActiveRecord::Base
  holds_things
end

user = User.new
user.has_things? -> true

admin = Admin.new
admin.has_things? -> true

inside-module plugin layout

The failing case

Seems pretty simple, right?

Turns out it’s not. Take a look at the directory layout that I tried to use. This seems like a standard for a gemmable plugin. The model files are contained in the gem library, and accessed as part of the module. When you use gem 'polymorphic_plugin', the only thing that gets copied to your Rails project is the migration file. Nice and clean.

Unfortunately, that doesn’t work. If you clone this branch and run rake test you’ll get exceptions. Specifically, a NameError: uninitialized constant User::ThingGrouping because our User model, by extending the PolymorphicHolder module, doesn’t have access to this unknown model called ThingGrouping.

And no, using things like :class_name and :source were no help. I tried everything, or seemingly everything. Nothing would make this work.

outside-module plugin layout

The passing case

That is until I pulled the models outside of the plugin module.

Take a look at the directory layout now and you’ll notice that the Thing and ThingGrouping models are no longer in the plugin’s lib directory. Moving them to the templates directory is the unfortunate answer.

I say “unfortunate” because this means that the models need to be distributed by copying them to the Rails project. In other words, there’s a line in my PolymorphicPluginGenerator that reads: template "thing.rb", File.join('app/models', "thing.rb"). In other words: Copy the Thing model into this project so it can be accidentally futzed with by users and maybe, if we’re lucky, cause some interesting name collisions.

Thing and ThingGroup are no longer contained inside my PolymorphicPlugin module. They are top-level classes equivalent to anything generated with rails generate model. Not a solution that I’m fond of, but one that passes my tests. We can at least have a polymorphic :has_many, :through relationship now.

Outcome

Polymorphic :has_many, :through relationships are available in pluggable Rails modules, but it’s a bit of a kludge. You’ll need to make sure you name your polymorphic classes smartly to avoid name collisions with the calling Rails project. You’d hate to create a plugin with a model like Book only to find that Book already exists in someone’s Rails project!

I’d love to be proven wrong on this, by the way. Go ahead and grab the Github repository and play with the inside-module branch. If you can make it work, I’ll buy you a beer!

Written by

November 15th, 2011 at 12:28 pm

Posted in Ruby

Rails 3.1 Gemmable Plugins with RSpec

leave a comment

I’ve had a bitch of a time lately getting the new Rails 3.1 plugin architecture to play nicely with RSpec. I actually gave up and coded an entire plugin with Test::Unit before finally figuring out a decent way to do it.

Currently, the new Rails 3.1 mountable plugin architecture will not work with RSpec. There’s a gem called Enginex that will work with RSpec, but it won’t work with Rails 3.1. So it looks like you either get RSpec or Rails 3.1. What’s the deal?

Playing around, I figured out that combining the two will work:

$ gem install enginex
…
$ enginex my_plugin --test-framework=rspec
…
$ rails -v
Rails 3.1.1
$ rails plugin new stock_plugin --full
…
$ rm -rf my_plugin/spec/dummy
$ cp -r stock_plugin/test/dummy my_plugin/spec

After that, it’s just a matter of modifying my_plugin/spec/dummy/config/application.rb to require your gem, and clean up the spec_helper.rb file. I also changed the Gem files so that my_plugin.gemspec held the dependencies, and Gemfile just called that. This is the way the stock Rails 3.1 generator works. Enginex uses Gemfile as the canonical source, and I like the new way better.

Using this I’ve currently got a Rails 3.1 gemmable plugin with RSpec, Cucumber, Capybara, Spork, Guard, and Simplecov working just fine.

Written by

November 14th, 2011 at 12:41 pm

Posted in Ruby