Intridea Company BlogFeed_icon

Present.ly Chrome Extension

We’re always looking for ways to make it easier to keep up to date with your co-workers using Present.ly. Recently I’ve been using the Mac Beta of Chrome and thought a Chrome Extension could be a great way to use Present.ly throughout the day. As of today it is available on Google’s Chrome Extension Directory.

Present.ly Chrome

The functionality of the extension is still growing, but you can read and post updates to your network as well as view text attachments. It will keep refreshing automatically and let you know when new updates come in, letting you check in without even opening a new tab!

As with all of our client applications, the Present.ly Chrome extension is available as open source on GitHub. We think it’s a great new way to access Present.ly, and we hope you enjoy it!

Blogs: Company Comment | 

Official VOA PNN Application Released for iPhone and Android

On the heels of U.S. Secretary of State Hillary Rodham Clinton’s Net Freedom speech, Intridea was delighted to receive notification Apple had approved the official iPhone application we developed for Voice of America’s (VOA) Persian News Network (PNN).

“This new application gives Iranians a unique opportunity to get the latest news on their mobile devices and to share with the world the news as it happens in their country,” said Acting PNN Director Alex Belida. “It is a groundbreaking way to expand our reach inside Iran and deepen our relationship with a key VOA audience.”

Following Iran’s troubling elections in the Summer of 2009, the Senate aptly passed the Victims of Iranian Censorship (VOICE) Act, which provided much needed funding and support to the Broadcasting Board of Governors to expand Farsi language broadcasting into Iran by the Voice of America’s Persian News Network.

“This application empowers Iranians at a time when the government is staging a crackdown against opposition protesters,” Mr. Belida said. “As with the disputed elections [last] year, VOA’s Persian service continues to be a leading source of news and information for Iranians.”

In this video, Hamed Behravan, Sr. VOA Correspondent showcases the newly released mobile application to millions of Iranian television and web-based viewers, on his weekly Technology Roundup segment.

Built under the technical leadership of Brendan Lim, Intridea’s Director of Mobile Solutions, the application is designed for iPhone and Android Devices, and features the ability to read the latest VOA News Stories and share them through Facebook, Twitter, or e-mail. Users can also keep up-to-date with the VOA PNN’s Twitter feed (@voapnn). Additionally, “the application allows users to anonymously report news accompanied with either an image or video captured directly from their mobile device” says Lim; “enabling a new wave of citizen journalism.”

Intridea is dedicated to supporting Gov 2.0 projects and programs that promote human rights, uphold democratic principles, and strengthen civil institutions. In the case of the VOA PNN App, we have been given an opportunity to create a platform that extends the Iranian people the freedom of speech - in real-time.

Many important security measures were considered to operationally defeat or circumvent censorship and/or surveillance of content created, shared or stored by users. And with future guidance from the VOA & US State Department, Intridea plans to develop other sophisticated transmission techniques to counter the Iranian government’s use of filtering systems, and general stranglehold of internet & mobile transmissions.

The VOA PNN application was built using Appcelerator’s Titanium Mobile platform. Using Titanium Mobile, we were able to create an application for both, iPhone and Android, using just a single codebase. Also, Titanium Mobile allowed us to develop these native applications using only HTML, CSS, and JavsScript, which greatly reduced the amount of development time.

Here’s how to get it:

On iPhone or iPod Touch
You can download it directly from the App Store. You can also find it by searching for ‘VOA PNN’.

On jailbroken iPhone or iPod Touch
If you have a jailbroken iPhone, you can find the application through Cydia or Rock. The application is listed under the BigBoss source, which is included by default on both of these applications. Just do a search for ‘VOA PNN’ to install the application.

On Android
The application is listed under News & Media in the Android Marketplace. You can also search for ‘VOA PNN’ to install it.

The Android version features the same functionality as the iPhone version. However, since Google doesn’t officially support the Farsi language, users who wish to use the app on their Android devices will have to add Farsi character support on their own. To install Farsi on your Android device, check the links below.

Stay tuned for more.

Blogs: Company Comment | 

Simple Mustache JSON Serialization

If you’ve taken a look at Mustache, the “stupid in a good way” templating engine, you might know that there are also Javascript Mustache renderers such as Mustache.js. Today we’ve released a small library called mustache_json that allows you to compile your Mustache view objects into JSON, allowing them to be interpreted by Javascript Mustache rendering engines.

What this means for your project is that you will finally have a identical client-side and server-side rendering interface, opening wide the opportunities for pushing more of the rendering work onto the client-side, a boon for many real-time and heavy-interaction applications.

To install mustache_json, just get the gem from Gemcutter:

gem install mustache_json

To use it, simply require 'mustache_json' and all of your Mustache objects will automatically be given a #to_json method. For instance:

require 'mustache_json'

class Person < Mustache
  def initialize(first_name, last_name)
    context[:first_name], context[:last_name] = first_name, last_name
  end

  def initials
    "#{context[:first_name][0..0]}.#{context[:last_name][0..0]}." 
  end

  def listing
    "#{context[:last_name]}, #{context[:first_name]}" 
  end
end

bob = Person.new('Bob', 'Bobson')
bob.to_json

This will render into a JSON object that looks like this:

{"last_name":"Bobson","initials":"B.B.","listing":"Bobson, Bob","first_name":"Bob"}

Mustache JSON gives you access to all of the public instance methods you declare in your Mustache as well as any context you have set. It is essentially a fully compiled version of the Mustache view, providing everything another renderer needs to create the actual markup. The JSON back-end for this library is swappable, meaning you can use the JSON gem, JSON pure, ActiveSupport, or Yajl by default (and any other class with an encode method if you’ve got a different library).

Documentation is available on RDoc.info and the source is available on GitHub. Stay tuned for posts in the future about utilizing this library to actually perform identical rendering in Ruby and Javascript.

Blogs: Company, Development Comment | 

Presently Now Available for Palm webOS Devices

Coming hot off the heels of the Presently 2.0 release for the iPhone, comes Presently for Palm webOS. Presently for Palm brings most of the same great features from the iPhone version to any Palm webOS device, such as the Pixi or the Pre, with the unique look and feel of Palm webOS applications.

Some of the great features of the webOS version of Presently include:

  • Post and view updates
  • View your replies, direct messages, and your feed
  • View profiles groups and people
  • View updates for groups and people
  • Join existing Presently accounts
  • Create your own Presently account if you don't have one
  • ... and much more

With this latest release you can now keep up with your company natively on the iPhone, Android, or Palm webOS platform anywhere you go. Presently for webOS devices is now available on Palm's App Catalog.

Blogs: Company Comment | 

Presently v2.0 Released for iPhone

A new version of the Presently application has just been released for iPhone and is now available on the App Store. Presently for the iPhone is the best way to keep in touch with your co-workers where you're not in front of your computer. The new version of Presently brings a completely new application, developed using Appcelerator's Titanium Mobile platform, that is packed with many more features than the previous.

Below is a list of just some of the great new features that have been added to the latest version of Presently for iPhone.

  • Completely redesigned user interface
  • iPhone 3GS users can now post videos with their update
  • Can view a list of all users and groups
  • Profiles for individual users or groups
  • Follow or unfollow specific users
  • Join or leave specific groups
  • View followers and whom an individual is following
  • Search through all users
  • Search through all groups
  • View last updates for any user or group
  • View mentions for any user or group
  • View updates from any of your custom feeds within Sources
  • View updates from any of your groups within Sources
  • Offline-capabilities for your main feed
    • The new version of Presently is now available for free on the App Store.

Blogs: Company Comment | 

Hashie: The Hash Toolkit

One of my earliest gems was Mash, a useful tool for creating mocking objects as a Hash. One of the most common problems people had with Mash was a simple one: it conflicted with another class of the same name in extlib! To address this problem as well as give the project some room to grow, Mash is now part of a new toolkit called Hashie. Hashie is available now via Gemcutter and the source, as always, is available on GitHub. To install:

gem install hashie

Hello, Hashie

Hashie is, right now, simply the former Mash code along with a new extended Hash called a Dash. A Dash is a “discrete hash” that has pre-defined properties. It can be used as a dead-simple data object when even something like DataMapper is too heavy, but a Struct is too light (Dash gives you the ability to set per-property defaults as well as initialize from an attributes Hash). For example:

class Person < Hashie::Dash
  property :name
  property :email
  property :occupation, :default => 'Rubyist'
end

p = Person.new
p.name # => nil
p.occupation # => 'Rubyist'
p.email = 'abc@def.com'
p.email # => 'abc@def.com'
p['awesome'] # => NoMethodError

p = Person.new(:name => "Awesome Guy")
p.name # => "Awesome Guy" 
p.occupation # => "Rubyist"

The other advantage Hashie has over Mash is that it’s built from the ground up to avoid conflicts. Instead of adding stringify_keys methods to the Hash class, it’s instead added to a Hashie::Hash subclass. You can, however, get Hashie’s few Hash extensions in the Hash class by including the HashExtensions:

Hash.send :include, Hashie::HashExtensions

Hopefully the move will make it easier for everyone to use it in their projects without fear of running into conflicts, and hopefully you’ll also find the Dash useful. Over time the functionality of Hashie may grow to encompass additional simple and useful extensions of Hash. So install Hashie, your friendly neighborhood Hash toolkit, today!

Blogs: Company, Development Comment | 

Car Finder Becomes a Hit Application for iPhone

We released Car Finder just over a week ago and the amount of attention we’ve received is much more than we could have ever anticipated. For those of you who don’t know, Car Finder is an iPhone application that utilizes augmented reality to help you find where you parked your car.

thugfinder
Note: Car Finder developer Brendan Lim and his brother (with the dollar) sold separately

Throughout this whole process we’ve noticed that the Twitter mentions that came after these news articles proved to play a huge part in Car Finder’s success. Below are a list of a few articles that covered the release of Car Finder.

Wired UK
Save face with the Car Finder augmented reality app

The Unofficial Apple Weblog
Use Augmented Reality to Find Your Car

Autoblog
Latest auto iPhone app: Augmented reality parked car finder

Holy Kaw!
Can’t find your car? There’s an app for that. – Holy Kaw!

Cult of Mac
Car Finder iPhone App Uses Augmented Reality To Find Your Wheels

Boing Boing
Car Finder app for iPhone

Car Finder is available now on the App Store for $0.99. Intridea offers services for application development on all major mobile platforms, which include iPhone, Android, BlackBerry, and Palm webOS. If you need help with your mobile application feel free to contact us for a quote.

Blogs: Company Comment | 

Quick Tip: Readable Conditional Validations in Rails

This is something that many may already use as a best practice, but if not it’s something simple and convenient to add to your repertoire. Sometimes you may have a model that requires additional information if a certain condition is met. For example, I may require a user to add more information about themselves if they wish to be listed publicly, whereas I would not if they do not wish to be listed. By combining ActiveSupport’s Object#with_options and ActiveRecord’s conditional validations, we can implement this behavior in a straightforward and readable manner (assuming here that there is a boolean field called “listed” in the database that is exposed as a checkbox or similar to the user):

class User < ActiveRecord::Base
  # Our standard validations
  validates_presence_of :login
  validates_uniqueness_of :login

  # Validations for listed users
  with_options :if => :listed? do |l|
    l.validates_presence_of :email
    l.validates_length_of :description, :minimum => 100
  end
end

It’s a simple technique that piggybacks off of Rails’s automatic construction of existence query methods (in this case, listed?) for fields in the database combined with the mapping power of with_options and standard conditional validations.

Blogs: Company, Development Comment | 

Use Augmented Reality to Find Your Vehicle With Car Finder for iPhone

If you’ve ever parked your vehicle in a large parking lot you’ve realized that it would be great to have something help you memorize where your car was. Intridea’s latest iPhone application, Car Finder, helps you do just that. Unlike the cookie-cutter car finding applications in the App Store, Car Finder helps you find your car using augmented reality.

Using the camera, A-GPS and the compass built into the iPhone 3GS, Car Finder allows you to find your car by positioning an overlay on top of a live view of what’s in front of you. Also, when you mark your car Car Finder allows you to set a note for your parking spot. This is particularly useful if you know what section you’re parked in or if the GPS is spotty in the location that your car is currently parked in.

Car Finder is available now on the App Store for $0.99. Intridea offers services for application development on all major mobile platforms, which include iPhone, Android, BlackBerry, and Palm webOS. If you need help with your mobile application feel free to contact us for a quote.

Blogs: Company Comment | 

Presently Adds SharePoint Integration

We’re always looking for ways to make it easier to integrate Presently into your day-to-day workflow. Today, we’re happy to announce something that will make it much easier for businesses using Microsoft’s SharePoint to integrate Presently. Starting today businesses can use the Presently SharePoint Web Part.

The Presently Web Part will allow you to view and post updates to your company’s Presently account from directly inside your Microsoft SharePoint portal. For more information on the installation and usage of the Web Part, you can visit the SharePoint application page.

We have also released the source code to the web part, it’s available on GitHub. Please feel free to contact support with any additional questions.

Blogs: Company Comment | 

Find Great Sushi Anywhere with SushiMe on iPhone

Adding to Intridea’s collection of great food finding applications for the iPhone, like iPho and iCurry, comes SushiMe. SushiMe allows you to find great sushi restaurants around you using your current location or any location that you specify. You can sort through a list of restaurants by their rating (provided by Yelp) or by their distance. With SushiMe you can also view a map of all of the restaurants around you and even call them directly from your iPhone to make reservations.

SushiMe is a free application and is available right now in the App Store. Intridea offers services for application development on all major mobile platforms, which include iPhone, Android, BlackBerry, and Palm webOS. If you need help with your mobile application feel free to contact us for a quote.

Blogs: Company, Development Comment | 

Present.ly Updates iPhone App With Camera and Attachment Integration

Present.ly, our enterprise microblogging platform, which is used daily by many large corporations and government organizations, offers native versions of the application on all major mobile platforms. Today, Apple has approved the latest version of Present.ly for iPhone.

Included in this latest version is an updated user interface. The new user interface ditches the previous dark theme and replaces it with a look that is more familiar to iPhone users and is easier on the eyes. Uploaded attachments can be viewed directly from the phone. Updates with one or more attached files are indicated by a small paperclip icon within your feed.

In addition to attaching files, photos from your photo library or the iPhone camera can be added to your updates—a highly anticipated feature. This version of the app provides a more robust user experience by enabling many of the most useful features of the web client. Present.ly is a free application available in the App Store. To get Present.ly for your iPhone click on the link below.

Blogs: Company Comment | 

Intridea Kicks off Mobile Development Services With Two Free iPhone Apps for Foodies

Sometimes you just want an application that gets something done quick and gets it done right -- especially if your stomach's calling. That's why we've decided to create iPho and iCurry for the iPhone.

iPho will help you find the best phở around you using your current location or any address you use using the built-in search. iCurry does the same but allows you to search through the best Indian food around.

Both of these applications will show you a list of restaurants sorted by their average rating or their distance relative to you or the address you search from. You can also drill down into each restaurant so that you can get their address, get directions, give them a call, and even see if they are open. There's even a map view which overlays all of the restaurants around you. Ratings and listings are provided using the Yelp API. Both iCurry and iPho are free applications and are available now on the App Store.

Along with the announcement of these two great applications, we at Intridea are kicking off our mobile development services for our clients. We are offering services for application development on all major mobile platforms, which include iPhone, Android, BlackBerry, and Palm webOS. We've built a great team of talented mobile developers that can help bring your product or service to the mobile market. Expect to see more mobile related announcements soon.

Need help with your mobile app? Contact us for a quote.

Download iPho

Download iCurry


Blogs: Company Comment | 

TweetStream: Ruby Access to the Twitter Streaming API

Twitter’s Streaming API is one of the most exciting developments in the Twitter API in some time. It gives you the ability to create a long-standing connection to Twitter that receives “push” updates when new tweets matching certain criteria arrive, obviating the need to constantly poll for updates. TweetStream is a Ruby library to access the new API.

Installation

Installation of TweetStream is simple, it’s available as a gem on GitHub and Gemcutter.org. To install it from GitHub:

gem sources -a http://gems.github.com
gem install intridea-tweetstream

To install it from Gemcutter:

gem sources -a http://gemcutter.org
gem install tweetstream

Usage

TweetStream creates a long-standing HTTP connection to Twitter, so unlike other Twitter libraries you don’t simply run it once and deal with the results. Instead, you provide a block that will be yielded to with each new status that arrives. The most basic example is:

require 'rubygems'
require 'tweetstream'

TweetStream::Client.new('user','pass').sample do |status|
  puts "[#{status.user.screen_name}] #{status.text}" 
end

This will provide you with a small sample snapshot of all of the updates being posted to Twitter at this moment and print them to the screen. There are also methods available to track single-word keywords as well as the updates of a specified list of user ids (integers, not screen names). You can do that like so:

# Track the terms 'keyword1' and 'keyword2'
TweetStream::Client.new('user','pass').track('keyword1', 'keyword2') do |status|
  puts "[#{status.user.screen_name}] #{status.text}" 
end

# Track users with IDs 123 and 456
TweetStream::Client.new('user','pass').follow(123, 456) do |status|
  puts "[#{status.user.screen_name}] #{status.text}" 
end

Handling Deletion/Limit Notices (Updated in 0.1.4)

Sometimes the Streaming API will send messages other than statuses. Specifically, it does so when a status is deleted or rate limitations have caused some tweets not to appear in the stream. To handle these, you can use the on_delete and on_limit methods. Example:

TweetStream::Client.new('user','pass').on_delete{ |status_id, user_id|
  Tweet.delete(status_id)
}.on_limit { |skip_count|
  # do something
}.track('intridea') do |status|
  # do something with the status like normal
end

Daemonization

One of the most useful features of TweetStream is its built-in daemonization functionality. This allows you to create scripts that run in the background of your machine rather than taking up an active process. To create a daemon script, you simply use TweetStream::Daemon instead of TweetStream::Client. Here’s an example:

require 'rubygems'
require 'tweetstream'

# The third argument is an optional process name.
TweetStream::Daemon.new('user','pass','tracker').track('keyword1','keyword2') do |status|
  # Do something like dump the status to ActiveRecord
  # or anything else you want.
end

If you were to place the above code in a file called tracker.rb you could then run ruby tracker.rb to see a list of daemonization commands such as start, stop, or run.

TweetStream is a simple wrapper on the Streaming API, but with built-in daemonization provides powerfully flexible means of accessing the Twitter Streaming API using familiar Ruby tools. More complete code documentation is available at rdoc.info.

Update: I overlooked the deletion and rate limit notices when I wrote the initial version of the gem. As of version 0.1.4 these are handled properly.

Blogs: Company, Development Comment | 

CouchDB-Lucene, CouchDBX, and CouchRest

I’ve been playing a lot with CouchDB lately and if you’re on OS X there’s really no easier way to do so than by using CouchDBX, a self-contained application that includes CouchDB, Erlang, and all of the dependencies you need to run Couch.

However, recently I wanted to try the power and functionality of couchdb-lucene for full-text indexing of a CouchDB application on which I was working. It wasn’t immediately obvious to me how to make that happen, so I thought I’d share how I got it working for those who might want to do the same. For the record, I am using the following versions of things:

Unpacking CouchDB Lucene

You will need to place CouchDB Lucene in a convenient location, but first you’ll need to unpack the gZip file. Note that, at least for me, the default Mac unarchiver did not provide a suitable .jar file. Instead, follow the README instructions and extract it using the following command:

unpack200 couchdb-lucene-0.4-jar-with-dependencies.jar.gz couchdb-lucene-0.4-jar-with-dependencies.jar

It doesn’t particularly matter where you put it (I put mine in /usr/local/etc) so long as you remember the location.

Editing the CouchDBX .ini File

Next you will need to edit the CouchDBX local.ini file to add the external for full-text indexing. To access the file, right-click CouchDBX and select “Show Package Contents” then navigate to Contents/Resources/couchdbx-core/couchdb/etc/couchdb/local.ini and open it up in your favorite text editor. You will need to add the following lines to this file, taking note to change the directory to match where you stored your Lucene .jar file.

[couchdb]
os_process_timeout=60000 ; increase the timeout from 5 seconds.

[external]
fti=/usr/bin/java -server -Xmx1g -jar /path/to/couchdb-lucene-0.4-jar-with-dependencies.jar -search

[update_notification]
indexer=/usr/bin/java -server -Xmx1g -jar  /path/to/couchdb-lucene-0.4-jar-with-dependencies.jar -index

[httpd_db_handlers]
_fti = {couch_httpd_external, handle_external_req, <<"fti">>}

All right, that’s all the setup you need to be running CouchDB Lucene! Now you can start up CouchDBX and set up your first search indexes.

Creating a Full-Text Index View

To create a full-text index view, you simply need to add a “fulltext” field to one of your design documents. The URL structure for accessing CouchDB Lucene searches is as follows:

http://localhost:5984/database_name/_fti/design_doc_name/index_name?q=your+query+here

Where database_name is any database you have on your system, design_doc_name is any design document in your database, and index_name is a fulltext index you defined. For instance, if I had a CouchRest generated design doc for a bunch of music, I might have a design document that looks something like this:

{
  "_id":"_design/Song",
  "_rev":"af12a4b12af1b24afbf244f1",
  "fulltext":{
    "my_search":{
      "index":"function(doc) { if (!doc['couchrest-type'] == 'Song') return null; var ret = new Document(); ret.add(doc.title); ret.add(doc.artist); return ret; }" 
    }
  }
}

I would then be able to access the search results with this URL:

http://localhost:5984/myapp/_fti/Song/my_search?q=Ben+Folds

Awesome! We now have full-text indexing up and running on CouchDBX!

Bonus: CouchRest Lucene

I use CouchRest extensively in my Ruby CouchDB projects, and I wanted to be able to integrate the new Lucene searches easily. I found this post that added a bit of functionality, but I wanted to be able to integrate with ExtendedDocument (and the snippet was also slightly outdated), so I’ve updated it. Just add this sometime after you include CouchRest:

class CouchRest::Database
  def search(design, index, query, options={})
    CouchRest.get CouchRest.paramify_url("#{@root}/_fti/#{design}/#{index}", options.merge(:q => query))
  end
end

class CouchRest::ExtendedDocument
  def self.search(index, query, options={})
    options[:include_docs] = true
    ret = self.database.search(self.to_s, index, query, options)
    ret['rows'].collect!{|r| self.new(r['doc'])}
    ret
  end
end

What this snippet does is allows you to perform searches on a database directly or by calling a search method on an extended document. Let’s look at a couple examples to see how it would work:

@db = CouchRest.database!("http://localhost:5984/myapp")

@db.search('Song','my_search', 'Ben Folds', :include_docs => true)

# The following is equivalent to the above, but will automatically
# include the docs and cast the result rows into ExtendedDocuments
Song.search('my_search', 'Ben Folds')

Now that we have this set up, we’re ready to go forth and build full-text search into our CouchDB apps. I hope this is helpful to some who have become somewhat familiar with CouchDB but are looking to push it a little further and try out some of the more advanced usages of CouchDB in their applications.

Blogs: Company, Development Comment |