Showing posts with label facebook. Show all posts
Showing posts with label facebook. Show all posts

Monday, July 04, 2011

Google+ and Hitting the Reset Button

Reset your social network

So you might have heard this week that there's this new social networking thing (*yawn*) called Google+. That's right, it's from Google. So it's gonna suck, right? I was skeptical at first, as were many others. After all, nobody roots for The Big Company who clones popular products made by smaller companies, and Google has had a well known poor track record in this space. But after a few days of using Google+, I'm a believer -- in its potential. Here's why.

Google+ is a chance to hit the rest button on social networking. For me, when I first started using Facebook it was mostly to catch up with old college classmates. Two big events happened later. Facebook was opened up to everybody, and Twitter showed up. When Facebook was opened up to everyone, I pretty much accepted friend requests from anyone I knew at all. I still didn't use Facebook that much. Meanwhile I really fell in love with Twitter when it showed up. On there I connected mostly with people in the same or related professions as me. Most of my tweets were around things that had to do with my job (programming, technology.)

Meanwhile on Facebook, I had more and more family members join. Suddenly Facebook became a great place to share family related things, especially pictures. Then I hooked up my Twitter account to Facebook. Now I could just post things to Twitter, and they would show up on Facebook. Then I would occasionally post pictures on Facebook as well. However, most of my tweets were geeky stuff. I did have some co-workers and college classmates who found such things interesting, but more and more most of my friends on Facebook (lots of family high school classmates) found this useless. Eventually I cut off the Twitter-Facebook connection.

My story here is certainly different from a lot of folks, but I imagine there are a lot of similarities too. Google+ seems to offer the possibility to do things over and get it right this time. The key is its grouping feature, Circles. You have to put people in Circles, so you are motivated to organize your friends. This is important. Facebook and Twitter have both had similar features for awhile, and they just aren't used. Twitter's lists aren't really comparable since you still send tweets to everyone. Facebook's groups are more comparable, so why aren't they used?

All your privacies are belong to us

First and foremost, I don't think Facebook really wants anyone to use them. They have a pretty strong history of trying to decrease privacy on their network. Obviously Facebook benefits if everything posted on their network can be searched and viewed by others on Facebook. It seems like one of those features that they added because some users wanted it, but it did not benefit Facebook The Business. Within a couple of days of Google+'s debut, reports came out of a Facebook engineer easily hacking together the same interface to use with Facebook groups. So clearly it would have been pretty easy for Facebook to make groups easy for users to use to organize their friends and incorporate groups into content published on Facebook, but instead Facebook chose not to do this.

This raises the question of why the heck is Google+ doing it? If I had to guess, I doubt that Google really wants to do this either. However, this is one of many places where Google+ feels like something designed around the strengths and weaknesses of its competition, Facebook and Twitter. Privacy was an obvious weakness of Facebook and so Google+ takes advantage of that. It's the kind of thing you do to get market share, whereas Facebook has been doing just the opposite because they are trying to monetize existing users and content.

Resistance is futile

Privacy is not the only place where Google+ feels like a product that has been cleverly designed around its competition. In fact it reminds me a lot of embrace, extend, extinguish era Microsoft. I think they have realized that they don't necessarily have to come up with something that Facebook and Twitter don't do at all, they can just do a lot of the same things and do them a little better. Some other examples of this are viewing pictures and allowing rich markup in status updates. So they make a slightly better product, then they play their own monopoly card by putting the G+ bar on top of all Google pages, including search results and GMail...

Anyways, going back to privacy... The creation of Circles is only half the battle. The other half is picking which of your Circles to publish to. G+ has made this easy to do, and it is a feature that I want to use. However, I don't know if others will do the same. Right now it still seems like most posts that I read are public. This may change as more people start to use G+, but maybe not.

If it doesn't change, then G+ then seems like it will be more of a competitor to Twitter than to Facebook. It already has a lot of similarities, since it uses an asymmetric friendship model like Twitter. I definitely noticed a drop in tweets by those I follow on Twitter since G+ came out. If people don't use the privacy features, then the most it could become is a better Twitter. There have been other better Twitters before, so I don't know if that is good enough. Features like hangouts (group video chat) and huddles (group messaging) seem like they could appeal to Facebook users, but it's hard to say right now. For me, the kind of folks who I use Facebook to communicate with, but would not use Twitter to communicate with, have not even heard of Google+. Yet.

 

Sunday, October 25, 2009

Social Technology Fail

This is the kind of posting that needs a disclaimer. I'm going to talk a little about recent changes at Facebook and Twitter, but strictly from a technology perspective. It goes without saying that I have no idea what I'm talking about. I am fortunate enough to be acquaintances with several engineers at both companies, and I have a college classmate (and fellow Pageboy) who seems to be a pretty important dude at Facebook, but I have no extra knowledge of these companies' technology than anybody else. So just to repeat: I have no idea what I'm talking about. You should really stop reading.

Since you are still reading, then I will assume that you too enjoy being an armchair architect. Since my day job is as an architect at eBay, I tell myself that exercises such as this make me better at my job. Heh heh. Let's start with Facebook.

For several months now, I've noticed an interesting phenomenon at Facebook. My news feed would often have big gaps in it. I have about 200 friends on Facebook, and I'd say that around 70% of these friends are active, and probably 20-25% are very active Facebook users. So at any time I could look at my feed, and there would be dozens of posts per hour. However, if I scrolled back around 3-4 hours, I would usually find a gap of say 4-6 hours of no posts. The first time I ever noticed this, it was in the morning. So I thought that this gap must have been normal -- people were asleep. Indeed, most of my friends are in the United States. However, I started noticing this more and more often, and not always in the morning. It could be the middle of the day or late at night, and I would still see the same thing: big gaps. So what was going on?

Well here's where the "I don't know what I'm talking about" becomes important. Facebook has been very happy to talk about their architecture, so that has given me speculation ammo. It is well known that Facebook has probably the biggest memcached installation in the world, with many terabytes of RAM dedicated to caching. Facebook has written about how they have even used memcached as a way to synchronize databases. It sure sounds a lot like memcached has evolved into something of a write-through cache. When you post something to Facebook, the web application that you interact with only sends your post to the cache.

Now obviously reads are coming from cache, that's usually the primary use case for memcached. Now I don't know if the web app can read from either memcached and a data store (either a MySQL DB, or maybe Cassandra?) or if Facebook has gone for transparency here too, and augmented memcached to have read-through cache semantics as well. Here's where I am going to speculate wildly. If you sent all your writes to a cache, would you ever try to read from anything other than the cache? I mean, it would be nice to only be aware of the cache -- both from a code complexity perspective and from a performance perspective as well. It sure seems like this is the route that Facebook has taken. The problem is that not all of your data can fit in cache, even when your cache is multiple terabytes in size. Even if your cache was highly normalized data (which would be an interesting setup, to say the least) a huge site like Facebook is not going to squeeze all of their data into RAM. So if your "system of record" is something that cannot fit all of your data... inevitably some data will be effectively "lost." News feed gaps anyone?

Maybe this would just be another useless musing -- an oddity that I noticed that maybe few other people would notice, along with a harebrained explanation. However, just this week Facebook got a lot of attention for their latest "redesign" of their home application. Now we have the News Feed vs. the Live Feed. The News Feed is supposed to be the most relevant posts, i.e. incomplete by design. Now again, if your app can only access cache, and you can't store all of your data in cache, what do you do? Try to put the most "relevant" data in cache, i.e. pick the best data to keep in there. Hence the new News Feed. The fact that a lot of users have complained about this isn't that big of a deal. When you have a very popular application, any changes you make are going to upset a lot of people. However, you have to wonder if this time they are making a change not because they think it improves their product and will benefit users overall, but if instead it is a consequence of technology decisions. Insert cart before horse reference here...

Facebook has a great (and well deserved) reputation in the technology world. I'm probably nuts for calling them out. A much easier target for criticism is Twitter. I was lucky enough to be part of their beta for lists. Now lists are a great idea, in my opinion. Lots of people have written about this. However, the implementation has been lacking to say the least. Here is a very typical attempt to use this feature, as seen through the eyes of Firebug:

It took my five attempts to add a user to a list. Like I said, this has been very typical in my experience. I've probably added 100+ users to lists, so I've got the data points to back up my statement. What the hell is going on? Let's look at one of these errors:

Ah, a 503 Service Unavailable response... So it's a temporary problem. In fact look at the response body:

I love the HTML tab in Firebug... So this is the classic fail whale response. However, I'm only getting this on list requests. Well, at the very least I'm only consistently getting this on list requests. If the main Twitter site was giving users the fail whale at an 80% clip... In this case, I can't say exactly what is going. I could try to make something up (experiments with non-relational database?)
However, this is much more disturbing to me than what's going on at Facebook. I don't get how you can release a feature, even in beta, that is this buggy. Since its release, Twitter has reported a jump in errors. I will speculate and say that this is related to lists. It would not be surprising for a feature having this many errors to spill over and affect other features. If your app server is taking 6-10 seconds to send back (error) responses, then your app server is going to be able to handle a lot less requests overall. So not only is this feature buggy, but maybe it is making the whole site buggier.
Now, I know what we (eBay) would do if this was happening: We'd wire-off the feature, i.e. disable it until we had fixed what was going wrong. Twitter on the other hand...

Huh? You've got a very buggy feature, so you're going to roll it out to more users? This just boggles my mind. I cannot come up with a rationale for something like this. I guess we can assume that Twitter has the problem figured out -- they just haven't been able to release the fix for whatever reason. Even if that was the case, shouldn't you roll out the fix and make sure that it works and nothing else pops up before increasing usage? Like I said, I just can't figure this one out...

Saturday, October 10, 2009

The End of The Aughties

There are 72 days left in the Aughties, y'know the current decade: 2000 - 2009. I was looking back at the decade, and what are its most important events. Here's my little list:

9/11 -- This is obvious. September 11, 2001 is clearly one of the most pivotal days in the history of the United States. In the previous century, there are probably only a couple of comparable events: the bombing of Pearl Harbor, V-E day, the moon landing, the JFK assassination. For several generations of Americans, 9/11 will be the most historical day of their life.

The Election of Barack Obama -- President Obama's election was historical in so many ways. Obviously it was historic that an African American was elected President. It also marked a transition to a new generation -- Obama is 15 years younger than Bush or Clinton (and let's not even mention McCain.) Obama is not only a Democrat, but is not from the more conservative, Southern Democrats of Clinton and Jimmy Carter.

Social Media -- Here's where maybe my perspective is skewed by living in Silicon Valley. Social media is not a single event, in fact it is a progression of events. To me, it really started with blogging and YouTube, and then exploded with MySpace, Facebook, and Twitter. It is a fundamental change in the Internet. Every user is a creator of content, as well as a consumer. It is the great democratizing effect of the Internet, and it is only getting started. Even now we are starting to see how businesses, celebrities, etc. realize that not only can they use social media as a channel to customers and fans, but that it is a two-way channel.

Hurricane Katrina -- What made Hurricane Katrina so pivotal is that opened the eyes of Americans. It made people realize that many of their fellow Americans live in awful conditions. The divide between socioeconomic classes in America were never so obvious as during Katrina. When Kanye West went on TV and said that George Bush didn't care about black people, he wasn't just being a jackass, he was stating a sentiment shared by a lot of people.

The iPhone -- What did I say earlier about having a Silicon Valley perspective? Anyways... The iPhone has completely changed so many things for so many people. In the 90's, The Internet changed people's lives by bringing them information. Now the iPhone lets them carry it around in their pocket. Other phones were certainly moving in that direction, but the iPhone broke through by combining a large display with highly usable touch based interface. This revolution continued with the release of the App Store. Now don't get me wrong. A lot of other phones are following suit -- but that's exactly why the iPhone was so historical.

That's my short list. I know it's obviously biased from me being American and living in Silicon Valley. What did I miss? What doesn't belong?

Saturday, April 04, 2009

All Your Pages Are Belong To Us

Remember back when people realized that the Internet was a valuable way to reach customers and potential customers? You would see all of these television or print ads where they would print the URL of a website, or even radio ads would have somebody read the URL of a website. Oh wait, I guess this is still done a lot. Whatever, a while back this really became unnecessary. Whatever the name of your brand or product, you could just search for it in the search engine of your choice and find the same link that was being advertised. Who wants to try to remember a URL anyways?

Well the days of remembering a URL may be coming back, sort of. Earlier tonight I was watching UNC beat down Villanova. During a TV timeout, there was an ad for a movie. I honestly do not remember the name of the movie. At the end of the commercial, they put up a URL. Only this time the URL was something like http://www.facebook.com/name_of_movie. That's right, if you wanted to know more about this product, you needed to go inside the proverbial walled garden that is Facebook.

Now if you just searched for the name of this movie, would you get the link to the Facebook page? Maybe, but maybe not, or maybe it would depend on the search engine. Of course, if you were already on the Facebook site, and searched there, then you surely would find this page. So what does this mean? Do we need to start remember and typing in URLs? Or do we just need to do all of your search inside Facebook?

Friday, November 14, 2008

Facebook Puzzler in Scala

An associate of mine pointed out some fun programming puzzles on Facebook. This one was interesting to me. It was interesting because I think it is poorly. Well at the very least it confused on first read. When specifying the cost/weight, if they would have just used the word 'each' in there it would have been far less confusing... Anyways, I decided to solve the problem in Scala, since I've been doing a lot more Scala programming lately. Here is my Solver:

object Solver {
def cache = new scala.collection.mutable.HashMap[(List[Int], Int), List[List[Int]]]()

/**
* Generates a list of solutions to the Diophantine inequality
* w1*x1 + w2*x2 +... wN*xN >= max
* where weights = (w1,w2,...wN)
* Each solution is a minimal solution.
* This means that if (x1,x2,...xN) is a solution
* then (x1,x2, ... ,-1 + xM , ... xN) is NOT a solution
*/
def solve(weights: List[Int], max: Int): List[List[Int]] = {
if (cache.contains((weights,max))){
return cache((weights,max))
}
if (weights.length == 1) {
return List(List(max / weights(0) + 1))
}
var all: List[List[Int]] = Nil
var a = 0
while (a * weights(0) < max) {
all = all ++ solve(weights.drop(1).toList, max - a * weights(0)).map(a :: _)
a += 1
}
val solution = (a :: weights.drop(1).map(_ * 0)) :: all
cache.put((weights,max), solution)
solution
}

/**
* For a given set of weights (w1, w2, ... wN) and costs (c1, c2, ... cN)
* This finds the solution (x1,x2,...xN) to the inequality
* w1*x1 + w2*x2 + ... wN*xN <= max that minimizes the total cost
* c1*x1 + c2*x2 + ... cN*xN
* It returns the solutions as a Tuple where the first element is
* the solution (x1,x2,...xN) and the second is the minimal total cost
*/
def optimizer(costs: List[Int], weights: List[Int], max: Int): (List[Int], Int) = {
val solutions = solve(weights, max)
var answer: List[Int] = Nil
var best = (answer, Integer.MAX_VALUE)
solutions.foreach((solution) => {
val cost = solution.zip(costs).foldLeft(0){(a,b) => a + b._1*b._2}
if (cost < best._2) {
best = (solution, cost)
}
})
best
}
}

I put in the cache for memoization purposes, but it doesn't always help. For example, with their sample input/output, the cache is useless. Anyways, I showed the problem to other smarter folks who immediately pointed out that this was a variant of the unbounded knapsack problem and that my solution uses dynamic programming.

Here's a dirty little secret about yours truly. I studied mathematics in college, not computer science. So it's always amusing for me to come across a problem like this and have people start talking about CS terms. Personally I looked it as a Diophantine equation (inequality to be more accurate.) Of course maybe if I was a CS person, then I would have written a nicer solution.

Monday, April 21, 2008

Video Solution

Last week my oldest son, Michael, Jr. was in a musical production at his preschool. Of course we videotaped it so we could share it. This wasn't the first time I had shared video online, but this time really made me annoyed. I was really annoyed with the poor quality of sharing sites like YouTube. I tried Facebook's video sharing, and it wasn't much better. I decided it was time to roll my own. After some experimenting here is the stack of tools and service I came up with.

Video Importing/Editing: iMovie. This is what I was already using. iMovie is famously easy to use. The importing is easy, the editing is easy. The default export is .m4v files, which are H.264 files designed to work on iPods. This is important.

Video Playing: Flash. I wrote my own video player using Flex. The Flash player has built-in support for H264 video. Thus the videos I export out of iMovie play naturally in the Flash player. They just need some Flash code to load and control the video stream. I wrote this myself as it was pretty straightforward. I created an external XML file as a metadata repository. This tells my player what videos are available and information about each video, like its size. I hosted the custom built player and metadata files on Google Page Creator.

Video Storage: Amazon S3. This was the most difficult part. S3 is relatively cheap. It is NOT easy to use, contrary to what others might say. I was shocked to discover that there is no interface (web or desktop) for uploading and managing files stored on S3. I wound up using S3Fox. It seems like a nice interface, but buggy. Amazon really should offer administrative tools.

Next Steps: Ideally I would build a plugin for iMovie that would upload the video to S3 and write the metadata about the movie to my Google Pages. I am thinking of doing an AIR app for this first, and then maybe go Cocoa. I must also monitor my usage to make sure that S3 is cheaper than other alternatives like Box.net.

Thursday, November 29, 2007

Meebo Platform and ActionScript

It has been a month or so since Meebo announced their "platform." Platforms are all the rage these days, six months after Facebook made everyone envious with their F8 platform. One interesting thing I noticed about Meebo's platform was that they gave you your choice of programming in JavaScript or ActionScript. How nice. So I took a look at their ActionScript support.

Several things jump out quickly, but let's state the obvious ones. They provide a Flash component for Flash 8. Now it's cool that they provide a component (even if "installing a component is arcane), but Flash 8. Seriously? Clearly this is something written in ActionScript 2.0. Now it would be one thing if they wanted to provide some support for AS2 developers, but what about AS3? It just seems crazy for a brand new platform to not support the latest version of one of the two languages it supports. It would be like Silverlight only supporting C# 1.1.

There's also the issue of providing support for the Flash IDE exclusively as well. I guess with AS3 support only, this is all you can expect. The Flash IDE is not made for developers, it is made for designers. Flex Builder is obviously the choice for developers, though it has its drawbacks.

I didn't see if Meebo provides the source code for the SWC. If they did, it probably wouldn't be too hard to compile it for AS3. Actually you might be able to use the AS2 component within an AS3, I haven't tried that. Still, if you're going to launch a me-too platform, at least do it right.

Thursday, November 08, 2007

Flock 1.0

In case you missed the news, Flock finally went 1.0 late last month. I've been playing around with Flock for over a year. They're integration with social services has gotten better and better. I did a clean install of it and setup my Flickr, YouTube, and Blogger accounts very easily. I've given up on using it for RSS, as having a server-based solution (Google Reader) is too valuable to me. They've also added Facebook and Twitter integration, two favorite services of mine. Both are well done. And of course it's based off Firefox 2.0 now, which is great. Most Firefox plugins work great with it. I'm using its blog writer right now, as I'm planning on using it as my primary for a week or so and then figure out if I should go back to Firefox or not.

Blogged with Flock

Tuesday, September 18, 2007

Facebook JavaScript

Just yesterday I was reading Marc Andreesen's latest musings on "platforms." He characterized Facebook's F8 platform as a plugin platform, where everything runs on your server but is shown inside the context of a page on Facebook. Technically he's wrong. If your application uses the Facebook Markup Language (FBML) then a Facebook server interprets the response from your server before sending a final response to the end user. After all, no browser supports FBML (yet?) so something has to turn it into HTML and JavaScript.

Of course a lot of applications don't use FBML at all, and use the IFrame approach instead. I am currently working on just such an application. My reason was not using FBML was simple: I needed JavaScript. I didn't even need complicated JavaScript. I just needed to let users click on an image, then set some hidden fields and submit a form. Pretty simple really, but not possible with FBML. Until today.

I go on Facebook this morning and what do I see? An announcement about Facebook JavaScript. I had actually seen this mentioned as being in beta a couple of weeks ago, and I guess it went from beta to production very rapidly.

Looking at its documentation, the were two puzzling things. First, you have to put your JS, err I mean FBJS, inside XML comments... That's a minor thing, and I can easily imagine how it simplifies their parsing of the response from your server. Next, they've wrapped almost all the DOM properties and methods. This makes sense, after all they don't want people to actually get the real DOM object and start screwing around with Facebook's real estate. But their wrapper uses getter/setters for all the properties ... That just seems arbitrary. If Facebook was written using Rails I would expect something like that, but I don't expect something like this from PHP guys.

There were also some very expected things. Like no JS runs on the profile unless it is triggered by what Facebook is calling an "active" event (like clicking on an image or link.) You can't subclass Array or Function. Does this prevent you from accessing their prototype and overriding default behavior?

Anyways, I am happy to see FBJS. I wish it would have been out sooner, as I think it could have simplified some work I've done in the past.

Wednesday, August 01, 2007

Lunch 2.0 @ Facebook

Or should I say Lamebook... This is not my first Lunch 2.0. You can't help but compare these things a little, and Facebook does not fare well in any comparison.

First, they did a "happy hour" which meant beer and finger foods. So what you say? It's Lunch 2.0 damnit, not Snacky Snacky 2.0. The food matters.

Next it was very crowded and hot. Now I know that's partially just because so many people wanted to go to it because it was at Facebook. It's also because it was an inside event. Very limited space and lots of people = hot, noisy, sweaty, stinkiness. I'm sure this was the largest space that Facebook has available to it, but that's just another flaw in their based in Palo Alto logic (more on that later.)

Bad food, bad environment, what could save the event? How about some cool schwag! Oh wait, how about no schwag... You would think a company so obsessed with its collegiate roots would at least give out some t-shirts or knapsacks. Oh well. Simply Hired is still the king o' schwag.

Well what about the crowd? Well this was a decidedly younger crowd. I saw a lot of folks who had written on their nametags their names and their college. What the hell? Since when did Lunch 2.0 become Frat Party 2.0? Heh heh, I've become such an old fart. The crowd also had a lot more A-listers... Not sure if that's good or bad. I wonder how many of those folks will be at AOL next week. All in all, not as geeky a crowd as usual.

All that being said, I had a great time for one simple reason. I met up with an old Caltech classmate of mine, Robert Johnson, who's an infrastructure guru at Facebook. It was cool to catch up and talk about ye olden times. It was also cool to hear about some of the scale issues that Facebook has faced and things they're going to do about it, especially since we've faced and solved many similar issues over the years at eBay.

So that brings me back to Facebook, the company. I was really surprised to hear how they have three different buildings scattered around downtown Palo Alto. These guys really need to get a big space somewhere. Maybe they need to IPO or something to afford that. Seems unlikely they'd be able to do that in downtown Palo Alto. I know they are so in love with that area because of its ties to Stanford, but guess what guys. You're not in college anymore. Remember when you were in college and alumni would show up to hang out and pretend they were still in school? Remember how lame you thought those guys were? Umm...

Thursday, July 12, 2007

New Facebook App

Today I wrote a new Facebook app. It's a Flex based app that let's you watch the most popular videos on YouTube. You can watch the YouTube video from inside Facebook, which is kind of nice. That required some hacking of how YouTube hides the URL of their FLV files. The FLV is the actual video you watch on YouTube. People love to use the embed code for a YouTube video so they can put the video on their own page/blog/whatever. The embed references a SWF file. That SWF file is what references the FLV file and plays it inside the Flash Player.

Anyways, back to the Facebook app. I wrote it with the primary intent of using it for a presentation I'm planning on doing at FlexCamp in a few weeks. The presentation is going to be on *drum roll* creating a Facebook app using Flex. I'm also going to use the Find it on eBay application written by my colleague Anand Gangadharan. It's a lot more advanced than my little YouTube application.

Monday, June 25, 2007

Hacking my 8830

Ok, so not really. I've had my Blackberry for a little over a week, and I continue to be more impressed with it. Here are some useful things.

  1. Enable mass storage. You get a cryptic message for this, but totally want to do to this. It let's you access your Blackberry's file system. On my Macbook it makes the Blackberry look like a mounted drive, a la a DMG file or something, only its read/write not read-only. This is the easiest way to put pics or MP3s on there.
  2. MP3 Ringtones. Forget buying ringtones. Just load some MP3s on there. Go to your song by going to Media -> Music. Pick your favorite song and the pick Menu -> Set as Phone Tone. Now that MP3 is your default ring tone. Want a special ring tone for different people? Go to the person in your address book. Click Menu -> Edit. Then click Menu -> Add Custom Phone Tune. Click enter. This will bring up a list of pre-set ringtones. You don't want any of this garbage. But scroll to the top of the list and click Browse. Then click Menu -> Explore. I went to Media Card/MY_MP3S. That gave me all of my MP3s. I just picked whatever I wanted from there.
  3. Google Apps. Google obviously loves Blackberry users. GMail and Google Maps both rock for the Blackberry. Google Talk from RIM also rocks. If you open up Google Maps and pick a location, you can get directions. You'll notice that the "from here" is disabled. That's because GPS is not enabled for Google Maps by default, which brings me to my next tip.
  4. Enable GPS. A former co-worker of got an 8850 and thought that Verizon had disabled the GPS. That would be a very Verizon thing to do, but it turns it's not the case. Go to Options -> Advanced -> GPS -> GPS Services and switch it to Location On. It's set to "911 Only" by default. Open Google Maps and you'll have to grant Google Maps permission to use the GPS. Now you've got the full GPS enabled Google Maps functionality. I found that I needed to be outside to get a good signal on it.

These tips are for Mac users only.

  1. PocketMac. The Blackberry version is free and is very good.
  2. Google Calendar. I sync iCal to my Google Calendars, and then sync iCal to my Blackberry via PocketMac.
  3. Plaxo. I use Plaxo as a central repository for my contacts. I then installed the Plaxo plugin for Address Book. It becomes a cool read/write system. I update contacts in Address Book. That syncs things to Plaxo where they are persisted and available to me at work, etc. They are also copied to my Blackberry via PocketMac.

Other stuff...

  1. I downloaded Opera Mini. It works ok. There are some web pages I can view in it that I cannot view in the Blackberry browser, such as ESPN Fantasy Baseball. Entering text into Opera is a pain though. It has its own interface for this that seems awkward. I still think it will come in handy in the long run.
  2. I haven't tried syncing my Safari bookmarks to the Blackberry. That's a cool feature offered by PocketMac. I would need to clean up my Safari bookmarks first though.
  3. Facebook Mobile is really well done. You can do most things that you'd want to do on a mobile device there. A lot of folks prescribe to the iPod/iTunes model when it comes to mobile apps, i.e. read-only on the device, do all your writes from your computer. Facebook does a good job of giving the right "writes" on their mobile version.
Update: An old co-worker of mine and an anonymous commenter both pointed out that even though you can supposedly enable GPS, Google Maps and other similar programs are not able to use it. My friend claims that Verizon has disabled the GPS in some way. My experience has been the same, so maybe this is true. I don't know why Verizon would do this...

Update #2: Ah ha, now I know why Verizon has disabled the GPS on the 8830. There's got to be a hack though...

Tuesday, June 19, 2007

Ning

Last week I went to yet another Lunch 2.0. This one was at Ning. As I mentioned previously, Ning is of special interest to me. What they are doing is very similar to what we were doing at Ludi Labs. Actually I'd say that if you took a little bit of what Facebook has done with their markup and query languages, and added that to Ning, you get really darn close to what Ludi Labs was doing.

After listening to the folks at Ning and watching their demo, I was really amazed. I went out and created a Ning network for my fellow Ludi Labs survivors. Of course the thing I am most interested in doing is hacking the source code, even though it is in PHP. I've requested it from Ning.

Their content store is also very interesting. I'm curious to see just how extensible it is. They seem to claim they have a large selection of "common" data types. I'm skeptical. Why? Because that was always a thorny issue for us at Ludi Labs. We did the same thing. Actually I'd say that it was one of our mistakes. We created too many data types and each type was too flexible.

Even if they have the too large catalog like we did at Ludi, it's not going to be enough. What if I want to create a social network for Blackberry 8830 users? I create a widget of all the mobile apps that you can install on the 8830. I want people to be able to add to it and to search it.Link Clearly I'm going to have a data type that Ning does not support. They might have some kind of generic object type that can take user defined attributes, but it's going to have problems when I start busting out searches against these user defined attributes.

This may sound contrived, but trust me it is not. It is something that Ning must solve to be a viable platform. Marc Andreessen did a great write-up about the Facebook platform. One his great points was about how if you write a great Facebook app, you'll be doomed just like iLike. That's because you must host the app on your own server (farm.) He was clearly hinting out how this problem is solved by Ning, where your app is hosted by Ning. But if my little Blackberry app I just described is super slow on Ning once we get a few million entries into it and a few million users running searches against it, then it's no better than the Facebook Catch-22.

Thursday, June 07, 2007

Writing a Facebook App

I've been writing a Facebook app. They offer a Java client library (as well as several other non-official ones for other languages) but I'm using the PHP one. I really like the library they include. It has been incredibly easy to use, even for a PHP hacker like me.

One of the best parts of their library is the FaceRestClient call_method function. Only problem is that it does not work with photo uploads. Of course that happened to be one of the things I wanted to do. It doesn't work because you need to set a multi-part mime header for a photo upload and format the binary data per that content-type. Obviously all this can be done by hand, but luckily I found something better: the photos lib. This makes it trivial to upload an image. Here's the code I wrote for it:


include_once 'facebookapi_php5_restlib.php';
include_once 'facebook_php5_photoslib.php';

// get your own api_key and secret!
$facebook = new FacebookPhotosRestClient($api_key, $secret);

// user logged in prior to uploading pic, so sesion key passed as param
$session_key = $_REQUEST['session_key'];
$facebook->session_key = $session_key;

$tmpLocation = $_FILES['uploadedfile']['tmp_name'];

if (is_uploaded_file($tmpLocation)){
$aid = $_REQUEST['album'];
$caption = $_REQUEST['caption'];
$res = $facebook->photos_upload($tmpLocation, $aid, $caption);
echo "Here is a link to your pic, make sure you approve it first:".$res['link'];
} else {
echo "Ye gods! Something went wrong!";
}
?>

Thursday, May 31, 2007

Facebook

I must admit, the hype about Facebook's F8 platform has got to me. First, I started playing around with my very under-utilized profile on Facebook. I added some apps: Flickr and Twitter. These are "apps" on my blog as well, so they seemed natural enough. Then I added the most popular new Facebook app, iLike. I figured it would be similar to last.fm, which I had on my blog. I even went to the iLike site, signed up, and insalled their "sidebar" for iTunes.

What a disappointment! First, there is no connection between iLike and the iLike-Facebook-app. To add songs to the iLike-Facebook, you must do it manually. Ick.

Next problem, the iLike sidebar is very buggy. It seemed to keep my CPU utilization pegged. It didn't matter if I was listening to a song or nor, or if "hid" the bar. It's obnoxious anyways, taking up way too much real estate for an application that is a complement to another (iTunes.) When I realized that the songs I listened to on iTunes were not showing up on Facebook, it was obviously time to uninstall iLike.

Ok, so back to Facebook. I like the idea of their platform. It's much of a real platform than any of the widget/gadget/whatever platforms out there. They give you access to Facebook services, and give you UI tools for integrating your app's UI into Facebook.

What's interesting to me is to compare it to Ning. A Facebook app does not live on Facebook. It lives somewhere else. It can communicate with Facebook and its UI is shown inside Facebook. A Ning app lives on Ning. The Ning app must be written in PHP. The Facebook app can be written in any language. An app on Ning gets to take advantage of Ning's scalability. An app on Facebook can see huge traffic, but your server/hosting provider has to able to handle that. You had better find some quality, cheap server hosting.

Obviously I have some special interests in all this. At Ludi Labs, the Roost website had some similarities to Ning. It was a build your own site (we didn't add the social networking adjective) using all of these great services. Of course Ludi failed and Roost was never available to the masses. Thus I find myself rooting for Ning now. I think F8 poses a real problem for them...