Monday, November 30, 2009

iPhone 3G or Blackberry Storm? Still can’t resolve the dilemma?

There have been many debates regarding the choice of the best high-tech device between iPhone 3G and Blackberry Storm.  Undoubtedly they are meant for the different categories of consumers varying mainly between business and entertaining goals according to the features listed below:

For Blkackberry Storm the advantages are: Stereo Bluetooth capability (a good opportunity to  listen to your music collections via Bluetooth, wireless headsets without buying a third-party adapter), Removable battery (in case of using up it can be replaced by a new one easily, while the iPhone’s battery is fixed in), expandable memory (an expandable microSD media card slot allows to accommodate cards up to 16GB, but many prefer the iPhone's fixed 8GB or 16 GB memory to a Stoprm’s tiny extra card), Video Recording(for those who consider video capture more essential Storm is better for its 3.2 megapixel to the contrary of iPhone with its 2.0 megapixels).

As for the iPhone 3G: it’s now second-generation, it has a pretty cool design. What makes the Phone usability simple is the famous Safari browser. Surfing and zooming with two fingers on the pages is a real happiness. On the Facebook wall posts, friends, photos, all that becomes easier to arrange with iPhone which displays all the strengths of your community that are on the screen of a real computer. It possesses iTunes App store with a huge variety of iTunes, iTunes integration and iPod media player. So if music listening is your favorite leisure go ahead with choosing iPhone. As for Wi-Fi support with 3G you can have quite convenient internet score wherever you go.  Regarding the applications it still remains better than Blackberry devices.

At the end it should be noticed that no matter who you are - the busiest businessman or a joyful teenager both of these devices might be quite attractive for all of you.  Perhaps the best solution is to acquire the both to satisfy all your inner needs.

Friday, November 27, 2009

Gorilla Monkey Crunch - a new game in expectation of new record-breakers

Apple finally approves Gorilla Monkey Crunch for Thanksgiving. So players have an opportunity to play a new game for holidays.
Gorilla Monkey Crunch is a new game released by a London based iPhone and iPod Touch software development company Appnoose ltd. for iPhones and iPod touch. This is an arcade style 2D action game and is available for $0.99 in the Arcade Games section of Apple's iTunes App Store.

Easy and absorbing to play Gorilla Monkey Crunch can involve players of any age.
All you have to do is bombard other small monkeys downward with coconuts. Watch yourself not to be injured by the coconuts you throw down. If you miss the monkeys they will throw it back to you in order to damage the bridge you're sitting on and bring you down.  But the game construction provide you with the bonus timers n order to extend the time and toolkits to fix the bridge.

Record of scores have already been held by a 6 years old player with 6100 points, so you can be the next to achieve better results and post them to Facebook and Twitter.


Gorilla Monkey Crunch can be downloaded from the App Store.

Thursday, November 26, 2009

A new virus attacking the users of jailbroken iPhones

A new computer virus attacks the  iPhones and iPod Touch. It has been revealed by the company Sophos which specializes in computer security. The virus of type "duh" or "Ikee.B.", records and transmits personal information, including passwords, as well as  changes the administrative password of the device.

Main symptoms of infection may be revealed by shortening significantly battery life when the WiFi network access is enabled. The virus uses WiFi to transmit recorded information and broad cast on other devices. A worm first appeared on the iPhone last month but was not so dangerous. It is to notice that the worm only infects unlocked  iPhones and iPod Touch.

According to Sophos representatives, Apple's default root password - 'alpine' can't be a guaranty of security for most iPhone users as the new  worm may break in and and change it any way by directly editing the encrypted value of the password in the master password file, so that the new password can never be revealed. To avoid such kind of infections, Sophos strongly suggests to all users of jail-broken phones to change their passwords from  'alpine'  immediately.

Tuesday, November 24, 2009

Using KVO for Table Updates

If you've followed the guidelines in Apple's Model Object Implementation Guide when creating your data model objects, you can handle your UITableView updates using KVO. This frees you from having to spread calls to reloadData, insertRowsAtIndexPaths:withRowAnimation:, or deleteRowsAtIndexPaths:withRowAnimation: throughout your controller class wherever the data in your table might get changed.

Instead, all you have to do is observe the keypath on your data model object that holds the collection of items being displayed in the table. The easiest way to do that is in your table view controller's viewDidLoad method, like so:

    [self.data addObserver:self
forKeyPath:@"items"
options:0
context:NULL
]
;

Then, you just implement observeValueForKeyPath:ofObject:change:context to insert or remove rows based on changes to the observed collection. The information about which rows were inserted or deleted comes in the changes dictionary stored under the key NSKeyValueChangeIndexesKey. The information comes in the form of index sets, and those have to be converted to index paths in order to update the table. But that's the only thing about this code that isn't fairly straightforward, and this implementation is fairly generic, so you should be able to pretty much copy and paste it into your controller if you want to use it.

If you do do this, make sure you remove all the other remove and insert calls, otherwise you will double-delete and double-insert, which will cause errors at runtime.

- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
NSIndexSet *indices = [change objectForKey:NSKeyValueChangeIndexesKey];
if (indices == nil)
return; // Nothing to do


// Build index paths from index sets
NSUInteger indexCount = [indices count];
NSUInteger buffer[indexCount];
[indices getIndexes:buffer maxCount:indexCount inIndexRange:nil];

NSMutableArray *indexPathArray = [NSMutableArray array];
for (int i = 0; i < indexCount; i++) {
NSUInteger indexPathIndices[2];
indexPathIndices[0] = 0;
indexPathIndices[1] = buffer[i];
NSIndexPath *newPath = [NSIndexPath indexPathWithIndexes:indexPathIndices length:2];
[indexPathArray addObject:newPath];
}


NSNumber *kind = [change objectForKey:NSKeyValueChangeKindKey];
if ([kind integerValue] == NSKeyValueChangeInsertion) // Rows were added
[self.tableView insertRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationFade];
else if ([kind integerValue] == NSKeyValueChangeRemoval) // Rows were removed
[self.tableView deleteRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationFade];

}

Once you've done this, you can forget about reloading your table. Any changes made to the underlying data - even changes made on other threads (assuming your data model class is thread-safe) will automatically trigger an animated deletion or insertion. Although the code above may look a little intimidating, this actually allows a much cleaner overall design.

I've created a fairly simple Xcode project that illustrates using KVO to update a table view.

iLinguist West - 250 000 Words For Your iPhone

Translator could appear useful for almost everyone and there is nothing better when you pay once and use it forever. iLinguist West translator is an off-line dictionary which translates between English and one of 5 other languages: German, French, Italian, Dutch and Finnish.

The translator works off-line so no internet connection is required - no costs for roaming data when abroad and using your dictionary. The dictionary contains 250 000 words pairs in total, performs reverse translations, and additional searches on Wikipedia or Google (for this feature internet connection is required).

iLinguist West is already available on App Store and it costs $4.99.

Here are more features how to use it, watch our video instruction.


Apps Dev team is developing team for iPhone located in Czech Republic. You can follow our reference and visit the iLinguist East off-line translator, with which you can translate between English and five Eastern European languages (Czech, Russian, Polish, Slovak and Croatian).

Reference:
http://cut.io/aGU9

Saturday, November 21, 2009

Christmas Shopping Budgeting With Christmas Gifts List App

What if you have to buy Christmas gifts for parents, brothers, husband, sister, children, aunt, uncle and who else more but you have only particular amount of money. You must handle the challenge and be organized while shopping. In addition, you should better remember wishes of potential gift receivers. It could appear hard but not with the new app - Christmas Gifts List which is developed by AdamCode company. The app is so popular that its rank is 15th in paid productivity section of the iTunes App Store.


In this age of technology, you will find a new tool in the pockets and purses of many shoppers this season – the popular iPhone or iPod Touch. "Money management is extremely important to consumers right now,” said Adam Williams, President of Adamcode.com and creator of the “Christmas Gifts List” application – a unique holiday shopping list application with a built in budgeting feature. “The iPhone, when used with the right applications is the ultimate personal organizer, and can help keep shoppers from spending more than they intended”.

How many of us have faced this so-called Christmas overspending? It starts so innocently, $10 here, $15 there but just like everything else, it adds up quickly. Still, there is no need to go the way of the Grinch. The Gifts app allows consumers to input the wish lists for everyone on their holiday shopping list, avoiding another painful trip to the mall but each person can be assigned a target budget amount as well. As gifts are purchased and prices stored in the application, the easy to use interface lets you see how much money is left in the budget for each individual.

There is also very useful feature that allows you to turn on the lock and your lists are kept secure behind a unique PIN number. The Gifts app can take some of the stress out of the holiday season, so that the consumer can concentrate on what is important.


Christmas Gifts List is already available on App Store and it costs $0.99.

Reference:
http://cut.io/iyW5

iApplicate.tv Episode: Sonar Ruler

Here comes a new iApplicate.tv episode of Sonar Ruler, the iPhone app released by Laan Labs. This app takes iPhone to the extreme and is really great. Sonar Ruler helps users measure the distance of objects by making use of soundwaves! Perfect and now check out the video...

Friday, November 20, 2009

Private APIs

Fast with the late-breaking news, Gizmodo is reporting that Apple is now scanning submissions for illegal use of private APIs.. Really? Oh, no!

Only, this, um… isn't exactly new. This was already happening, and was already pretty widely known about three weeks ago.

Renewed RateMe App

Do you remember our review about RateMe app? Particular time has passed after that but RateMe is still getting scores in popularity among iPhone users. In addition, developer company Mobya made changes within the app and new useful features are already added, that is how we get RateMe version2.

An interesting one - "My photos" section is added. Now you can send as many photos as you want and come back later to review the results and comments. Also you can start and stop your photos at will.


The second is that now users have possibility to slide on photos (in addition to the next button) and a hidden function that allows them to skip a photo that they do not wish to vote on. Vote on one and they can skip the next one! Nevertheless, a warning to big voters, the photo that they have not voted on will probably come back eventually ;)


There was a lot of discussion around whether the app should stay free or not. Mobya decided to leave it free by adding advertisements within the comments. If the company has enough feedback of user asking for an ad-free version, they may do premium version without ads.

Features, in details:
• Take a photo using the app or choose one from your album;
• Change gender preferences in settings--choose to rate only men, only women or both!;
• Each comment shows what country the user is from;
• Press "stop" to take your photo off the voting pool;
• See average ratings for each photo;
• Fairness meter shows how fair you are being in comparison to other users

Here are some interesting figures: since the launch a few weeks ago, we can now count almost 300,000 votes for 10,000 photos uploaded. It looks very promising.


JoinMe is already available in App Store as it said it is free.

Mobya is a French company created in 2009. Mobya develops innovative and practical mobile apps for next generation phones. In addition, company developed other app like InstantPay and JoinMe.

Reference:
http://cut.io/bxL9

Thursday, November 19, 2009

Update to the MPMediaItemCollection Category

While testing and debugging, I made a few tweaks to this category. I still haven't added reordering, but I think the methods that are here are now pretty solid. If you downloaded the earlier one, you probably want to grab the updated version, as it now codes defensively so problems aren't caused when a collection becomes empty by deletion (media item collections can't be created without at least one media item).

MPMediaItemCollection-Utils.h
#import <Foundation/Foundation.h>
#import <MediaPlayer/MediaPlayer.h>

@interface MPMediaItemCollection(Utils)
/** Returns the first media item in the collection
*/

- (MPMediaItem *)firstMediaItem;

/** Returns the last media item in the collection
*/

- (MPMediaItem *)lastMediaItem;

/** This method will return the item in this media collection at a specific index
*/

- (MPMediaItem *)mediaItemAtIndex:(NSUInteger)index;

/** Given a particular media item, this method will return the next media item in the collection.
If there are multiple copies of the same media item in the list, it will return the one
after the first occurrence.
*/

- (MPMediaItem *)mediaItemAfterItem:(MPMediaItem *)compare;

/** Returns the title of the media item at a given index.
*/

- (NSString *)titleForMediaItemAtIndex:(NSUInteger)index;

/** Returns YES if the given media item occurs at least once in this collection
*/

- (BOOL)containsItem:(MPMediaItem *)compare;

/** Creates a new collection by appending otherCollection to the end of this collection
*/

- (MPMediaItemCollection *)collectionByAppendingCollection:(MPMediaItemCollection *)otherCollection;

/** Creates a new collection by appending an array of media items to the end of this collection
*/

- (MPMediaItemCollection *)collectionByAppendingMediaItems:(NSArray *)items;

/** Creates a new collection by appending a single media item to the end of this collection
*/

- (MPMediaItemCollection *)collectionByAppendingMediaItem:(MPMediaItem *)item;

/** Creates a new collection based on this collection, but excluding the specified items.
*/

- (MPMediaItemCollection *)collectionByDeletingMediaItems:(NSArray *)itemsToRemove;

/** Creates a new collection based on this collection, but which doesn't include the specified media item.
*/

- (MPMediaItemCollection *)collectionByDeletingMediaItem:(MPMediaItem *)itemToRemove;

/** Creates a new collection based on this collection, but excluding the media item at the specified index
*/

- (MPMediaItemCollection *)collectionByDeletingMediaItemAtIndex:(NSUInteger)index;

/** Creates a new collection, based on this collection, but excluding the media items starting with
(and including) the objects at index from and ending with (and including) to.
*/

- (MPMediaItemCollection *)collectionByDeletingMediaItemsFromIndex:(NSUInteger)from toIndex:(NSUInteger)to;
@end



MPMediaItemCollection-Utils.m
#import "MPMediaItemCollection-Utils.h"

@implementation MPMediaItemCollection(Utils)
- (MPMediaItem *)firstMediaItem {
return [[self items] objectAtIndex:0];
}


- (MPMediaItem *)lastMediaItem {
return [[self items] lastObject];
}


- (MPMediaItem *)mediaItemAtIndex:(NSUInteger)index {
return [[self items] objectAtIndex:index];
}


- (MPMediaItem *)mediaItemAfterItem:(MPMediaItem *)compare {
NSArray *items = [self items];

for (MPMediaItem *oneItem in items) {
if ([oneItem isEqual:compare]) {
// If last item, there is no index + 1
if (![[items lastObject] isEqual: oneItem])
return [items objectAtIndex:[items indexOfObject:oneItem] + 1];
}

}

return nil;
}


- (NSString *)titleForMediaItemAtIndex:(NSUInteger)index {
MPMediaItem *item = [[self items] objectAtIndex:index];
return [item valueForProperty:MPMediaItemPropertyTitle];
}


- (BOOL)containsItem:(MPMediaItem *)compare {
NSArray *items = [self items];

for (MPMediaItem *oneItem in items) {
if ([oneItem isEqual:compare])
return YES;
}

return NO;
}


- (MPMediaItemCollection *)collectionByAppendingCollection:(MPMediaItemCollection *)otherCollection {
return [self collectionByAppendingMediaItems:[otherCollection items]];
}


- (MPMediaItemCollection *)collectionByAppendingMediaItems:(NSArray *)items {
if (items == nil || [items count] == 0)
return nil;
NSMutableArray *appendCollection = [[[self items] mutableCopy] autorelease];
[appendCollection addObjectsFromArray:items];
return [MPMediaItemCollection collectionWithItems:appendCollection];
}


- (MPMediaItemCollection *)collectionByAppendingMediaItem:(MPMediaItem *)item {
if (item == nil)
return nil;

return [self collectionByAppendingMediaItems:[NSArray arrayWithObject:item]];
}


- (MPMediaItemCollection *)collectionByDeletingMediaItems:(NSArray *)itemsToRemove {
if (itemsToRemove == nil || [itemsToRemove count] == 0)
return [[self copy] autorelease];
NSMutableArray *items = [[[self items] mutableCopy] autorelease];
[items removeObjectsInArray:itemsToRemove];
return [MPMediaItemCollection collectionWithItems:items];
}


- (MPMediaItemCollection *)collectionByDeletingMediaItem:(MPMediaItem *)itemToRemove {
if (itemToRemove == nil)
return [[self copy] autorelease];

NSMutableArray *items = [[[self items] mutableCopy] autorelease];
[items removeObject:itemToRemove];
return [MPMediaItemCollection collectionWithItems:items];
}


- (MPMediaItemCollection *)collectionByDeletingMediaItemAtIndex:(NSUInteger)index {
NSMutableArray *items = [[[self items] mutableCopy] autorelease];
[items removeObjectAtIndex:index];
return [items count] > 0 ? [MPMediaItemCollection collectionWithItems:items] : nil;
}


- (MPMediaItemCollection *)collectionByDeletingMediaItemsFromIndex:(NSUInteger)from toIndex:(NSUInteger)to {

// Ensure from is before to
if (to < from) {
NSUInteger temp = from;
to = from;
from = temp;
}


NSMutableArray *items = [[[self items] mutableCopy] autorelease];
[items removeObjectsInRange:NSMakeRange(from, to - from)];
return [MPMediaItemCollection collectionWithItems:items];
}

@end