text:
NOTE: this post is out of date. Please follow the tutorial Getting Started With Offline Data Sync.
We've just released a preview version of the Azure Mobile Services SDK for iOS with offline support. Like the offline support in the .NET SDK, we're releasing a preview version of the offline so that we can get feedback (from you!) to make sure that we release this feature in a way that will suit your applications.
To present the new feature in the SDK, we'll walk through the steps to make our sample Todo app offline-enabled. We'll be talking about the features as they are needed for the app.
Initial Setup
To start off the walkthough, let's use the quickstart application that you can download in the portal. Create a new mobile service. For this example, let's use the node.js backend which we can setup without needing to use Visual Studio.
Once the service is created, choose the iOS platform, then select "Create TodoItem Table" and then download the starter project to your Mac.
Open it in Xcode and we're ready to start.
Updating the quickstart app
The offline support we're previewing here has some nice features. One of them is the ability to resolve conflicts which can happen when pushing the local changes to the table in Azure. For example, if you're running the same app in two phones, and changed the same item in both phones locally, when you're ready to push the changes back to the server one of them will fail with a conflict. The SDK allows you to deal with those conflicts via code, and decide what to do with the item which has a conflict.
The current quickstart, however, doesn't really have many occasions where conflicts can arise, since the only action we can take for an item is to mark it as complete. True, we can mark the item as complete in one client and then do the same in another client, but although technically this is a conflict (and the framework will flag it as such) it's not too interesting. Let's then change the quickstart to make it more interesting by allowing full editing of the todo items.
In the code you can download you'll see that I've updated the app to allow for editing the items. If you want to follow the same steps I did for that, you can go to the appendix at the end of this post.
Updating the framework
The first thing we'll need to do to add offline support in our application is to get a version of the Mobile Services iOS SDK which supports it. Since we're launching it as a preview feature, it won't be in the official download location. For now you can go to https://aka.ms/Gc6fex and download it locally.
Then, remove the existing framework from the project in Xcode, selecting "Move to Trash" to really delete the files.
And add in its place the new one which you get after unzipping the file downloaded above (make sure the "Copy items into destination group's folder (if needed)" is selected).
Setting up Core Data
Like in the managed SDK, the offline support in the iOS Mobile Services SDK is implemented in a store-agnostic way – meaning you could use whatever persistent store you want as long as it complies with the `MSSyncContextDataSource` protocol. That is a fairly low level protocol, and we don't expect many people to implement their own data sources, so we're including in this preview one data source which is based on the Core Data framework.
Since we're using this data store, let's prepare the application to work with Core Data. First, open the application target, and in its "Build phases", under the "Link Binary With Libraries", add the CoreData.framework
Next, let's add the Core Data boilerplate code. Open the QSAppDelegate header file and add the following declarations:
#import <uikit uikit.h> #import <coredata coredata.h> @interface QSAppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (void)saveContext; - (NSURL *)applicationDocumentsDirectory; @end
Now open the implementation file (QSAppDelegate.m) and add the implementation for the core data stack methods. Notice that this is pretty much the code that you get when you create a new application in Xcode and select the "Use Core Data" checkbox, with the main difference that we're using a private queue concurrency type when initializing the `NSManagedContextObject`.
@implementation QSAppDelegate @synthesize managedObjectContext = _managedObjectContext; @synthesize managedObjectModel = _managedObjectModel; @synthesize persistentStoreCoordinator = _persistentStoreCoordinator; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return YES; } - (void)saveContext { NSError *error = nil; NSManagedObjectContext *managedObjectContext = self.managedObjectContext; if (managedObjectContext != nil) { if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { // Replace this implementation with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } } } #pragma mark - Core Data stack // Returns the managed object context for the application. // If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. - (NSManagedObjectContext *)managedObjectContext { if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; } // Returns the managed object model for the application. // If the model doesn't already exist, it is created from the application's model. - (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel != nil) { return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"QSTodoDataModel" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel; } // Returns the persistent store coordinator for the application. // If the coordinator doesn't already exist, it is created and the application's store added to it. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"qstodoitem.sqlite"]; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { /* Replace this implementation with code to handle the error appropriately. abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. Typical reasons for an error here include: * The persistent store is not accessible; * The schema for the persistent store is incompatible with current managed object model. Check the error message to determine what the actual problem was. If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory. If you encounter schema incompatibility errors during development, you can reduce their frequency by: * Simply deleting the existing store: [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil] * Performing automatic lightweight migration by passing the following dictionary as the options parameter: @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details. */ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return _persistentStoreCoordinator; } #pragma mark - Application's Documents directory // Returns the URL to the application's Documents directory. - (NSURL *)applicationDocumentsDirectory { return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; } @end
At this point the application is (almost) ready to use Core Data, but it's not doing anything with it
Defining the model
The last thing we need to do to use the Core Data framework is to define the data model which will be stored in the persistent store. If you're not familiar with Core Data you can think of it as a simplified "schema" of the local database. We need to define the tables used by the application, but we also need to define a couple of tables which will be used by the Mobile Services framework itself (both to track the items which need to be synchronized with the server, and any errors which may happen during this synchronization).
In the project, select "New File", and under the Core Data section, select Data Model.
Select an appropriate name (I'll use QSTodoDataModel.xcdatamodeld) and click Create. Select the data model in the folder view, then add the entities required for the application, by selecting the "Add Entity" button in the bottom of the page.
Add three entities, named "TodoItem", "MS_TableOperations" and "MS_TableOperationErrors" (the first to store the items themselves; the last two are framework-specific tables required for the offline feature to work) with attributes defined as below:
|Integer 64
|Binary Data
|Binary Data
Save the model, and build the project to make sure that everything is fine. As before, we're just setting up the application to work with Core Data, but we haven't started using it yet.
From table to sync table
And let's start caching some data offline! There are a few things we'll need to change. First, instead of using the regular `MSTable` class to access the mobile service, we'll use a different class now: `MSSyncTable`. A sync table is basically a local table which "knows" how to push changes made locally to the "remote" table, and pull items from that table locally. We'll also need to initialize the *synchronization context* in the `MSClient` (a new property) with the data source that we choose (in our case, the Core Data-based store implementation as I mentioned before). Let's start. In the implementation for the QSTodoService class, remove the private property `table`, and add the following property for the sync table:
@property (nonatomic, strong) MSSyncTable *syncTable;
Now, in the initializer for the QSTodoService class, remove the line that creates the MSTable object and replace it with the following lines (you'll also need to `#include "QSAppDelegate.h"`):
QSAppDelegate *delegate = (QSAppDelegate *)[[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = delegate.managedObjectContext; MSCoreDataStore *store = [[MSCoreDataStore alloc] initWithManagedObjectContext:context]; self.client.syncContext = [[MSSyncContext alloc] initWithDelegate:nil dataSource:store callback:nil]; // Create an MSSyncTable instance to allow us to work with the TodoItem table self.syncTable = [self.client syncTableWithName:@"TodoItem"];
Before we can start using the offline feature, we need to initialize the sync context of the client. The context is responsible for tracking which items have been changed locally, and sending those to the server when a push operation is started. To initialize the context we need a data source (for which we can use the `MSCoreDataStore` implementation of the protocol), and an optional `MSSyncContextDelegate` implementation. For now we can pass `nil`, but we'll get back to it when talking about conflicts.
We now need to update the operations in the `QSTodoService` class to use the sync table instead of the (regular / remote) table. First, the `refreshDataOnSuccess`, which retrieves the data from the service. This time, we'll first ask the sync table to pull any items which match our criteria, then we'll load the data from the *local* (sync) table into the `items` property of the service.
- (void)refreshDataOnSuccess:(QSCompletionBlock)completion { // Create a predicate that finds items where complete is false NSPredicate * predicate = [NSPredicate predicateWithFormat:@"complete == NO"]; MSQuery *query = [self.syncTable queryWithPredicate:predicate]; // Pulls data from the remote server into the local table. We're only // pulling the items which we want to display (complete == NO). [self.syncTable pullWithQuery:query completion:^(NSError *error) { [self logErrorIfNotNil:error]; [self loadLocalDataWithCompletion:completion]; }]; } - (void) loadLocalDataWithCompletion:(QSCompletionBlock)completion { NSPredicate * predicate = [NSPredicate predicateWithFormat:@"complete == NO"]; MSQuery *query = [self.syncTable queryWithPredicate:predicate]; [query orderByAscending:@"text"]; [query readWithCompletion:^(NSArray *results, NSInteger totalCount, NSError *error) { [self logErrorIfNotNil:error]; items = [results mutableCopy]; // Let the caller know that we finished dispatch_async(dispatch_get_main_queue(), ^{ completion(); }); }]; }
For inserts, we only insert into the sync table. That operation will then be *queued* so that until we push the changes to the remote service, it will only be visible to the client where it was performed.
-(void)addItem:(NSDictionary *)item completion:(QSCompletionWithIndexBlock)completion { // Insert the item into the TodoItem table and add to the items array on completion [self.syncTable insert:item completion:^(NSDictionary *result, NSError *error) { [self logErrorIfNotNil:error]; NSUInteger index = [items count]; [(NSMutableArray *)items insertObject:result atIndex:index]; // Let the caller know that we finished dispatch_async(dispatch_get_main_queue(), ^{ completion(index); }); }]; }
A similar change for the update operation. One minor difference is that for `MSTable` update operations, the completion block returns the updated item, since a script (or controller action) in the server can modify the item being updated, and we want that modification to be reflected on the client. For local tables, the updated items are not modified, so the completion block doesn't have a parameter for that updated item.
- (void)updateItem:(NSDictionary *)item atIndex:(NSInteger)index completion:(QSCompletionWithIndexBlock)completion { // Cast the public items property to the mutable type (it was created as mutable) NSMutableArray *mutableItems = (NSMutableArray *) items; // Replace the original in the items array [mutableItems replaceObjectAtIndex:index withObject:item]; // Update the item in the TodoItem table and remove from the items array on completion [self.syncTable update:item completion:^(NSError *error) { [self logErrorIfNotNil:error]; NSInteger index = -1; if (!error) { BOOL isComplete = [[item objectForKey:@"complete"] boolValue]; NSString *remoteId = [item objectForKey:@"id"]; index = [items indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { return [remoteId isEqualToString:[obj objectForKey:@"id"]]; }]; if (index != NSNotFound && isComplete) { [mutableItems removeObjectAtIndex:index]; } } // Let the caller know that we have finished dispatch_async(dispatch_get_main_queue(), ^{ completion(index); }); }]; }
We can now really test the application offline. Add a few items in the app. Then go to the portal and browse the data (or use a networking tool such as PostMan or Fiddler to query the table directly). You'll see that the items have not been added to the service yet. Now perform the refresh gesture in the app by dragging it from the top. You'll see that the data has been saved in the cloud now. You can even close the app after adding (or editing) some items. When you launch the app again it will synchronize with the server (more on that later) and your changes will have been saved.
Pulling and pushing
There are basically two ways of synchronizing the data between the local store and the remote service. When we want to bring data from the service into the local tables, we need to perform a *pull* operation. This is executed in the sync table, so that you can pull data on a per-table basis. For example, if you have an application which displays orders and each order can have many items, you only need to load the orders locally, and only when an order is selected you need to pull data from the items table (assuming that the information is stored in those two tables). In the code shown in the previous section, the operation `refreshDataOnSuccess:` is pulling the data from the remote table into the local (sync) table. Notice that we can (and often should) pull only a subset of the table so that we don't overload the client with information that it may not need.
When the client performs some changes (inserts / deletes / updates) in the items locally, those changes are stored in the sync context to be sent to the server. A *push* operation sends the tracked changes to the remote server. You would call push in the sync context via the `pushWithCompletion:` method.
You may have noticed that in the code I showed above there are no calls to the push method. But the data is still being sent to the server, as you could see when performing the refresh gesture. What is happening is that **before a pull is executed, any pending operations are pushed to the server**. That is done to prevent conflicts – if an item is modified locally and in the service, we want to make sure that the service (the "source of truth") has the ability to reject the changes (thus the push) by returning a conflict response to the push request. An implicit push is also executed when we *purge* the local tables (via the `MSSyncTable`'s `purgeWithQuery:` method, which we don't use in this sample).
Threading considerations
Another thing which you may have also noticed is that after we changed the code to use the sync table, I wrapped the calls to the completion blocks in the `QSTodoService` methods in a dispatch call to the main thread:
dispatch_async(dispatch_get_main_queue(), ^{ completion(); });
Since when we initialized the sync context, we did not pass a callback parameter, the framework creates a default serial queue for you which dispatches the results of all sync table operations into into a background thread. This is advantageous for performance reasons as data operations are executed in the background, but when using the results to modify UI components we need to dispatch the code back to the UI thread.
Conflict handling
Well, offline handling of data is great, but what happens if there is a conflict when a push operation is being executed? To test this scenario you'll need a HTTP tool such as Fiddler or Postman to simulate changes from other devices (or two devices, or a device and the simulator – basically two different clients which can modify data).
Let's load the data in the app. In my list I have an item to "Buy eggs", but I'll edit it to "Buy eggs (6)":
On another client, I'll send a PATCH request for that same item to update it (the id, ETag, mobile service name and app key will be different for your service):
PATCH https://blog20140611.azure-mobile.net/tables/todoitem/D265929E-B17B-42D1-8FAB-D0ADF26486FA?__systemproperties=__version Content-Type: application/json x-zumo-application: UiMJHSlktoYGRxGtgkLfgGoZFjqcGS10 If-Match: "AAAAAAAAjkY=" { "id": "D265929E-B17B-42D1-8FAB-D0ADF26486FA", "text": "Buy organic eggs" }
Now try to refresh the items on the app. On the completion block in the call to `pullWithQuery:completion:`, the error parameter will be non-nil, which will cause the error to be printed out to the output via `NSLog` (line breaks added for clarity):
2014-06-09 23:40:04.297 blog20140611[8212:1303] ERROR Error Domain=com.Microsoft.WindowsAzureMobileServices.ErrorDomain Code=-1170 "Not all operations completed successfully" UserInfo=0x8f3a200 {com.Microsoft.WindowsAzureMobileServices.ErrorPushResultKey=( "The server's version did not match the passed version" ), NSLocalizedDescription=Not all operations completed successfully}
So we have a local change which cannot be pushed, since it's conflicting with what's in the server. To solve this issue we need to add a conflict handler. We could do that in the server (as is shown in [this tutorial](http://azure.microsoft.com/en-us/documentation/articles/mobile-services-windows-store-dotnet-handle-database-conflicts/)), but here we'll let the user decide how to handle the conflict by dealing with it in the client, and for that we'll need to implement the `MSSyncContextDelegate` protocol.
Let's start by changing our QSTodoService factory method to receive that delegate as a parameter. Remove the existing `defaultService` method and replace it with the declaration below:
+ (QSTodoService *)defaultServiceWithDelegate:(id)delegate;
In the implementation file, in addition to the change in the factory method, also modify the private constructor `init` to take the delegate as a parameter:
-(QSTodoService *)initWithDelegate:(id)syncDelegate
Now change the call to the initializer to pass the delegate, and change the initialization of the sync context to pass the delegate:
self.client.syncContext = [[MSSyncContext alloc] initWithDelegate:syncDelegate dataSource:store callback:nil];
On to the todo list view controller. Change the interface declaration to implement the `MSSyncContextDelegate` protocol:
@interface QSTodoListViewController : UITableViewController
and pass the `self` pointer to the delegate when initializing the `todoService` property:
// Create the todoService - this creates the Mobile Service client inside the wrapped service self.todoService = [QSTodoService defaultServiceWithDelegate:self];
Now we can implement the `tableOperation:onComplete:` operation, which will be called for every item which is being sent (pushed) to the service. Our goal here is to let the user choose which version they want to keep: the client (which will then override the version in the server), the server (whose value will remain unchanged, and will be updated in the client local table) or cancel the whole push operation (and leave the operation pending). And since while we're displaying the choices to the user another update may have happened in the same item on the server, we'll keep showing the options until the server stops returning a precondition failed response.
- (void)tableOperation:(MSTableOperation *)operation onComplete:(MSSyncItemBlock)completion { [self doOperation:operation complete:completion]; } - (void)doOperation:(MSTableOperation *)operation complete:(MSSyncItemBlock)completion { [operation executeWithCompletion:^(NSDictionary *item, NSError *error) { if (error.code == MSErrorPreconditionFailed) { QSUIAlertViewWithBlock *alert = [[QSUIAlertViewWithBlock alloc] initWithCallback:^(NSInteger buttonIndex) { if (buttonIndex == 1) { // Client NSDictionary *serverItem = [error.userInfo objectForKey:MSErrorServerItemKey]; NSMutableDictionary *adjustedItem = [operation.item mutableCopy]; [adjustedItem setValue:[serverItem objectForKey:MSSystemColumnVersion] forKey:MSSystemColumnVersion]; operation.item = adjustedItem; [self doOperation:operation complete:completion]; return; } else if (buttonIndex == 2) { // Server NSDictionary *serverItem = [error.userInfo objectForKey:MSErrorServerItemKey]; completion(serverItem, nil); } else { // Cancel [operation cancelPush]; completion(nil, error); } }]; [alert showAlertWithTitle:@"Server Conflict" message:@"How do you want to resolve the conflict?" cancelButtonTitle:@"Cancel" otherButtonTitles:[NSArray arrayWithObjects:@"Use Client", @"Use Server", nil]]; } else { completion(item, error); } }]; }
In this code we're using a helper class which shows an alert view and takes a delegate that is invoked when the alert view is displayed. The complete code can be seen in the repository shown below.
Wrapping up
We're now adding offline support for native iOS applications, and like in the managed SDK, we're releasing it in a preview format. We really appreciate your feedback so we can continue improving in the SDKs for Azure Mobile Services. As usual, please leave comments / suggestions / questions in this post, or in or MSDN Forum.
If you want to download the code used in this post, you can get it in the mobile services samples repository in GitHub, under https://github.com/Azure/mobile-services-samples/tree/master/TodoOffline/iOS/blog20140611.
Appendix: updates to the TodoItem project to make it ready for this post
Here are the steps needed to change the existing Todo list app downloaded from the Azure portal to make the items editable.
Preparing the navigation view
I'll show here the changes for the iPhone storyboard, but the same would apply for the iPad as well. Open the quick start in Xcode and select the MainStoryboard_iPhone.storyboard file. Once in there, select the main view controller, and on the Editor menu, select "Embed In", "Navigation Controller".
Next, select the table view cell in the Todo List View Controller and in the properties window set the Accessory mode to be "Disclosure Indicator"
Adding the details view controller
There are some cosmetic changes which I'll make but I'll skip them here for brevity of this post. Next, add a new view controller class which will back the details view controller which we'll add to the storyboard. Add a new Objective-C class called QSTodoItemViewController, derived from UIViewController to your project, and add a property of type NSMutableDictionary which will hold the item to be modified.
@interface QSTodoItemViewController : UIViewController @property (nonatomic, weak) NSMutableDictionary *item; @end
In the implementation (.m) file, add two private properties corresponding to the fields of the todo item which we'll edit:
@interface QSTodoItemViewController : UIViewController @property (nonatomic, weak) NSMutableDictionary *item; @end
@interface QSTodoItemViewController () @property (nonatomic, strong) IBOutlet UITextField *itemText; @property (nonatomic, strong) IBOutlet UISegmentedControl *itemComplete; @end @implementation QSTodoItemViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; UINavigationItem *nav = [self navigationItem]; [nav setTitle:@"Todo Item"]; NSDictionary *theItem = [self item]; [self.itemText setText:[theItem objectForKey:@"text"]]; BOOL isComplete = [[theItem objectForKey:@"complete"] boolValue]; [self.itemComplete setSelectedSegmentIndex:(isComplete ? 0 : 1)]; [self.itemComplete addTarget:self action:@selector(completedValueChanged:) forControlEvents:UIControlEventValueChanged]; } - (void)completedValueChanged:(id)sender { [[self view] endEditing:YES]; } - (void)viewWillDisappear:(BOOL)animated { [self.item setValue:[self.itemText text] forKey:@"text"]; [self.item setValue:[NSNumber numberWithBool:self.itemComplete.selectedSegmentIndex == 0] forKey:@"complete"]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (BOOL)textFieldShouldEndEditing:(UITextField *)textField { [textField resignFirstResponder]; return YES; } - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } @end
Now return to the storyboard and add a new view controller to the right of the list view. In the identity inspector, select the class added below as the custom class for the view controller. Then add a new push segue from the master view controller to the detail view controller, naming the segue "detailSegue". Add the appropriate fields in the view controller (a text field for the item text; a segmented control for the complete status) and link them to the outlets in the class.
At this point you should be able to run the app and when selecting an item in the table, it will show the (currently empty) details view controller.
Filling the detail view
Now that we have the storyboard ready, we need to pass the item from the master to the detail view, and update it once we're back. Let's first remove some methods which we won't need anymore: `tableView:titleForDeleteConfirmationButtonForRowAtIndexPath:`, `tableView:editingStyleForRowAtIndexPath:` and `tableView:commitEditingStyle:forRowAtIndexPath:`. Now add two new properties which we'll use to store the item which is being edited: `editedItem` and `editedItemIndex`.
@interface QSTodoListViewController () // Private properties @property (strong, nonatomic) QSTodoService *todoService; @property (nonatomic) BOOL useRefreshControl; @property (nonatomic) NSInteger editedItemIndex; @property (strong, nonatomic) NSMutableDictionary *editedItem; @end
Now implement the `tableView:didSelectRowAtIndexPath:` method to save the item being edited, and call the segue to display the detail view.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { self.editedItemIndex = [indexPath row]; self.editedItem = [[self.todoService.items objectAtIndex:[indexPath row]] mutableCopy]; [self performSegueWithIdentifier:@"detailSegue" sender:self]; }
Finally, implement the `prepareForSegue:sender:` selector to pass the item to the next controller.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"detailSegue"]) { QSTodoItemViewController *ivc = (QSTodoItemViewController *)[segue destinationViewController]; ivc.item = self.editedItem; } }
You should now be able to run the app and see the item displayed in the detail view.
Saving the edits
When you click the "Back" button in the navigation view the edits are lost. We've sent data to the detail view, but the data isn't being sent back to the master. Ideally we'd implement a delegate in the master view controller so that it can be notified when edits are done, but since we already passed a pointer to a copy of the item that is being edited, we can use that pointer to retrieve the list of updates made to the item and update it in the server.
But before changing the todo list view controller, we need to update the server wrapper class (`QSTodoService`), since it doesn't have a method to update items (it only has a method to mark an item as complete). Remove the method `completeItem:completion:`, and add the method below (declaration in the header file omitted)
- (void)updateItem:(NSDictionary *)item atIndex:(NSInteger)index completion:(QSCompletionWithIndexBlock)completion { // Cast the public items property to the mutable type (it was created as mutable) NSMutableArray *mutableItems = (NSMutableArray *) items; // Replace the original in the items array [mutableItems replaceObjectAtIndex:index withObject:item]; // Update the item in the TodoItem table and remove from the items array on completion [self.table update:item completion:^(NSDictionary *updatedItem, NSError *error) { [self logErrorIfNotNil:error]; NSInteger index = -1; if (!error) { BOOL isComplete = [[updatedItem objectForKey:@"complete"] boolValue]; NSString *remoteId = [updatedItem objectForKey:@"id"]; index = [items indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { return [remoteId isEqualToString:[obj objectForKey:@"id"]]; }]; if (index != NSNotFound && isComplete) { [mutableItems removeObjectAtIndex:index]; } } // Let the caller know that we have finished completion(index); }]; }
Now that we can update items on the server, we can implement the `viewWillAppear:` method to call the update method when the master view is being displayed while returning from the details view controller.
- (void)viewWillAppear:(BOOL)animated { if (self.editedItem && self.editedItemIndex >= 0) { // Returning from the details view controller NSDictionary *item = [self.todoService.items objectAtIndex:self.editedItemIndex]; BOOL changed = ![item isEqualToDictionary:self.editedItem]; if (changed) { [self.tableView setUserInteractionEnabled:NO]; // Change the appearance to look greyed out until we remove the item NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.editedItemIndex inSection:0]; UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; cell.textLabel.textColor = [UIColor grayColor]; // Ask the todoService to update the item, and remove the row if it's been completed [self.todoService updateItem:self.editedItem atIndex:self.editedItemIndex completion:^(NSUInteger index) { if ([[self.editedItem objectForKey:@"complete"] boolValue]) { // Remove the row from the UITableView [self.tableView deleteRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationTop]; } else { [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } [self.tableView setUserInteractionEnabled:YES]; self.editedItem = nil; self.editedItemIndex = -1; }]; } else { self.editedItem = nil; self.editedItemIndex = -1; } } }
And we're done with the preparation. The quick start project has been updated to allow edits, and ready to have the offline support as described in this post added to it.


text:
Comm Department Gets a Fresh Face
Friday, April 29, 2011
The Vista -- The new department chair of USD's department of communication studies is getting ready to shake things up for next year. Dr. Kristin Moran will officially become the new chair on July 1.
Moran received her Bachelor of Arts in Communication Studies from USD before obtaining her master's degree and doctorate from the University of Washington's School of Communication. She returned to her Alma Mater, USD, in 1999 as a visiting assistant professor and became a permanent faculty member in 2001. (Full Story)
Contact Information
James T. Harris III, DEd
Office of the President
Hughes Center 222
5998 Alcalá Park
San Diego, CA 92110
Phone: (619) 260-4520
Fax: (619) 260-6833
Office Hours8 a.m. - 5 p.m.

subset: commoncrawl


text:
Brussels: A major revolution in the passenger experience is set to emerge over the next three years as airlines invest in the 'Internet of Things' (IoT).
According to the SITA 2015 Airline IT Trends Survey, the vast majority of airlines (86%) expect that the IoT will deliver clear benefits in the next three years and already more than one third (37%) have allocated budget to it.
The results of the survey released today, show that IoT investments will be focused in the areas of check-in, bag drop and bag collection.
The 'Internet of Things' is when physical objects are connected to the internet, which enables tracking, data collection, analysis and control.
As part of this revolution, more things in the airport are being connected up including buildings, equipment, bags, trolleys, tugs basically all the 'things' that could emit a status.
In reality, however, because today the vast majority (83%) of passengers carry smartphones, passengers and staff are connected and can be part of the IoT too.
SITA's survey carried out among the world's top 200 airlines shows that airlines are already considering the benefits of IoT and over the next three years more than half plan investments in this area. By 2018, 16% plan major programs and a further 41% plan to invest in research and development.
Jim Peters, Chief Technology Officer, SITA, said, "Our whole world is becoming more and more connected and airlines recognize that investment will be needed to harness the benefits of IoT efficiently.
This year airlines are beefing up their investments in both business intelligence and data centers, which are key foundations required for the IoT.
Beacons for baggage
One of the first manifestations of the IoT in the air transport industry is the use of beacons. This will be the first area that airlines will see the benefits of sensors and the ability to match location with other information.
Today just 9% of airlines are using or trialing Beacons but this is set to rise rapidly to 44% by 2018. Bag services are the steps of the journey where beacons will be most used by then 44% of airlines are planning to use them at bag drop and 43% at bag claim.
Location, location, location
Another area of progress identified in SITA's survey is how communications are set to develop rapidly from the first wave of notification services, which are now established, to the point where interactive mobile communication becomes the standard for the majority of airlines.
The focus of these new services over the next three years will be to use location-based information, in many cases from beacons, to solve baggage-related issues and help passengers board on time with notifications based on their location, even before they reach the airport.
Data Science Congress 2017
20% off with code 7wdata_DSC2017
AI Paris
20% off with code AIP17-7WDATA-20
Chief Data Officer Summit San Francisco
$200 off with code DATA200
Customer Analytics Innovation Summit Chicago
$200 off with code DATA200
HR & Workforce Analytics Innovation Summit 2017 London
$200 off with code DATA200


text:
Remember This About Your Heart Please
To the broken hearted, both in love and life. This one is for you.
Remember that your heart was given to you and one other
Who has a key and is your only true lover
But also, remember that your heart is a organ
That it can be hurt, like a punch to the kidney
Too often, we view the heart as some phantom object
That exists, simply because we have blood in our veins
But it too, can hurt
And when it does, read the poetry of those who care for you
Who go on this site and read your scribblings
Your self prophetic, self critical, self pathetic prose
And tell you "It's great! I love it, Continue, I want more!"
"What the hell do they know." Come on, we've all said it
We've all ripped and torn thousands and thousands of poems and prose apart like the imaginary paper it's written on, and self debased ourselves to the point we hate ourseleves
Remember, that your heart, is a organ that can hurt.
And remember, out there, someone is reading
Someone is caring
And someone knows what your worth
(Author's Note: The most ironic thing is, the first words out of my mouth were "This sucks." Haha figured I'd share that)


text:
Self-leveling concrete (also called self-leveling underlayment or self-leveling mortar) can be purchased at most hardware and home center stores. Unlike the concrete used for sidewalks and other outdoor features, self-leveling concrete comes in the form of a fine powder and contains no aggregates such as sand or pebbles. There are self-leveling products that come "pre-mixed," but these are not compatible with radiant floor products. Only use self-leveling concrete that is mixed onsite.
There are many high-quality brands available that can be used with radiant heat products. We do not recommend any one over the others.


text:
Home ingredients for success
Growing aspirations for stylish and modern home are making Indian consumers spend more on home decor, kitchen ware and sanitary ware space. The market is developing at a healthy rate and presents a lucrative business opportunity for retailers. Let's disco...
The Indian Home Décor market, which stood at $13 billion in 2010, is expected to touch $20 billion this year, as per retail consultancy firm Technopak.
The shopping trend in this space is witnessing a shift from consumers investing only in furniture to growing interest in home decorative products including trendy lighting, bed linen and other accessories.
The category is becoming more of an impulsive buying like apparels. Arun Sirdeshmukh, founder of Fashionara, says, "Consumers are quite often changing the décor of their houses and buying it for gifting purposes. While it is still largely an urban phenomenon but smaller town consumers are also catching up."
"This category has higher average ticket size and profit margins at 50-60 per cent compared to others which make it more lucrative for online retailers," highlights Sirdeshmukh.
Franchising opportunity
This model helps the franchisee to rise in every aspect of business. "Our model attracts no royalty, franchisee fee or renewal fees. However, exclusivity is the central pillar of the franchisee model to ensure focus. Investments into the franchisee ranges from Rs 10 to 13 lakhs," says George Thomas, Director, Beth Lifestyle.
"With 43 per cent margins on purchase, the ROI is around 45 to 55 per cent and the payback period would be anywhere between 18 to 24 months," he adds.
What do brands look for while selecting the right partner? Talking about the same, GSS Jagannath, Sales and Marketing Manager - Sealy India, says, "We follow a simple process of selecting our brand partners. Anyone who is interested should have a high street/good location for the store, should have dealt with premium furniture/furnishing/home appliances brand and interest in taking the business to the next level." He further adds, "We work with the franchise partner to ensure that he grows with us. We give product training to every sales person in the store. We also support with a lot of POS materials to the dealer also with promotional schemes. We believe in cooperative advertisement wherein we share the cost as well."
The franchisors' support doesn't end here. Kumar Varma, Founder, Super Surfaces, shares, "We help the franchisee in monitoring the franchise and b2b interaction session with the selected associates to facilitate the use of product in the market."
Related: Growing through exclusive high end retail stores of dealers: Gessi India MD
The Franchising World
Submit your email address to receive the latest updates on news & host of opportunities.
Couriering Franchise Success To Entrepreneurs
Comments (166)
Grow like bamboo with a bamboo biz
Comments (101)
Reaping Profits 24X7
Comments (94)
Expanding Low-cost Rural Franchise
Comments (87)
Factory outlets generating twin profits
Comments (79)
Rent a Phone Franchise Benefits
Comments (72)
How to start a solar biz
Comments (69)
Good Profits Come In Small Kiosks
Comments (66)
Unleashing SME travel IntelliStay Hotels
Shared (110)
Show biz of success
Shared (103)
Fun with Funko franchising
Shared (89)
Premium Pizza profits
Shared (75)
Inking success
Shared (66)
Tap your feet in franchising
Shared (46)
Aura of success
Shared (46)
- Sanitary ware is expanding fast...
- Kitchenware growing via franchising...
- Arttdinox shines in designer kitchen...
- Growing through exclusive high end retail stores of...
- Digging out modular benefits from the kitchenette...
- King size profits in the mattress business...
- Furnishing success with furniture biz...
- Home Furnishing: Lighting Up Businesses, Homes...
- Home Care: A Franchise Delight...
- Wall papering success: the franchise way...
- Explore flooring benefits via franchising...
- Flooring benefits with Euro Ceramics...
- Guarding slipping gains...
- A well designed spread...
- Transferring expertise to channel partners...
Copyright © 2009 - 2017 Franchise India Holdings Ltd.
The information contained herein is of generic nature only, and Franchise India is not, by means of this website or any part thereof, rendering professional advice or services. Before making any decision or taking any action that might affect your finances or business, you should consult a qualified professional advisor. Your use of this website or any of its pages or links given, is at your own risk and you assume full responsibility and risk of loss resulting from your usage. With respect to use of the website, kindly visit www.franchiseindia.com/terms.


text:
ED Magedson – Founder
Ripoff Report
Devonshire Consulting International120 EGLINTON AVE. E., SUITE # 201 TORONTO, ONTARIO Atlanta,, Georgia United States of America
Does your business have a bad reputation?
Fix it the right way.
Corporate Advocacy Program™
This report was posted on Ripoff Report on 03/07/2011 12:31 PM and is a permanent record located here: http://www.ripoffreport.com/reports/devonshire-consulting-international/atlanta-georgia-/devonshire-consulting-international-cheryle-bidner-shelley-cash-lee-cash-ira-cash-chery-703753. The posting time indicated is Arizona local time. Arizona does not observe daylight savings so the post time may be Mountain or Pacific depending on the time of year.
Ripoff Report has an exclusive license to this report. It may not be copied without the written permission of Ripoff Report. READ: Foreign websites steal our content
Click Here to read other Ripoff Reports on Devonshire Consulting International
If you would like to see more Rip-off Reports on this company/individual, search here:Search Tips
In order to assure the best results in your search:
#1 Consumer Comment
Cheryle Bidner and her past catching up now to her
SUBMITTED: Saturday, July 27, 2013POSTED: Saturday, July 27, 2013
Amazing how 2 n a half years ago Cheryle Bidner was being cast in the limelight and now she claims everyone else except her is a fraud....where there is smoke there is fire--Today in almost August 2013 she is trying to turn the focus away from herself and on to others like Shelley Cash and Lee Cash but the reality is that she is really the one that the focus was and still should be on. look closely and dont be diswayed ---
Are you an owner, employee or ex-employee with either negative or positive information about the company or individual, or can you provide "insider information" on this company?
Advertisers above have met our
strict standards for business conduct.


text:
It only takes a minute to get started. Fill out our simple sign up form and login to the website.
This step is elective but will dramatically raise your chances of getting interest from other over 50s members on the site. Let people know a bit about yourself, your hobbies and upload any nice photographs of yourself.
Use our website's state-of-the-art search to uncover over 50s members who meet your requirements. Or just flip through listings and uncover members that take your fancy.
Discovered someone who meets your criteria? Send them a word or two or just a wink and see how you get along. With a little luck you'll be on your way to a lifetime of happiness.
It doesn't take long


text:
Need an IgE Blood Test in East Lake, FL? Simply order online 24/7 and get a fast, affordable IgE Blood Test at a lab near you (Find More Locations):
Why would I get an IgE Blood Test?
An IgE Blood Test measures the blood IgE antibody levels to things like foods and environmental allergens. People in East Lake, FL order the IgE Blood Test for general screening for allergies or ongoing tracking.
How much does an IgE Blood Test cost?
Our IgE Blood Test prices include the doctor's order that you need to get tested in East Lake, FL, all lab fees and taxes, and a pdf copy of your results. For current prices, please CLICK HERE.
We are pleased to offer an IgE Blood Test in East Lake, FL.
IgE Blood Test in other cities near East Lake, FL:Clearwater | Clearwater Beach | Crystal Beach | Dunedin | Holiday | New Port Richey | Odessa | Oldsmar | Ozona | Palm Harbor | Safety Harbor | Saint Petersburg | Tampa | Tarpon Springs | Town 'n' Country


text:
Director Rohit Shetty says if the sequel of his hit film Singham does well at the box office, he might think of turning the brand into a franchise.
"We were scared because after making comedy films like Golmaal series, All the Best and others I was switching my genre to action again. I did not know whether it will do well or not. I never thought a day will come when we will make a sequel to it," said Rohit.
"It depends how the sequel turns out as that is important for us. If people like it and if we get a good subject then why not. But at present there are no plans about turning it into a franchise. It is too early to talk about it," he said.
Read: Singham Returns deals with the problem of black money: Ajay Devgn
Considering the first part was a huge hit, there were certain challenges for Rohit while making the sequel.
"We had to make sure we were not repetitive. There were lot of films that released after Singham which had same kind of action, everyone was flying around, so the challenge was what new things we do. I never take pressure for my films. I try to work harder," Rohit said.
The film saw superstar Ajay Devgn playing the role of an honest police officer Bajirao Singham. The sequel, releasing next month, will see Ajay reprising his role.
"The film is based in Mumbai and Ajay is playing the role of a DCP this time. Earlier, the film was based in Goa and Ajay was playing ACP," Rohit said.


text:
Need an Allergy Blood Test in Warren, MI? Simply order online 24/7 and get a fast, affordable Allergy Blood Test at a lab near you (Find More Locations):
Why would I get an Allergy Blood Test?
An Allergy Blood Test checks the blood for antibodies related to allergy. People in Warren, MI order the Allergy Blood Test for general screening or to guide therapy.
How much does an Allergy Blood Test cost?
Our Allergy Blood Test prices include the doctor's order that you need to get tested in Warren, MI, all lab fees and taxes, and a pdf copy of your results. For current prices, please CLICK HERE.
We are pleased to offer an Allergy Blood Test in Warren, MI.
Allergy Blood Test in other cities near Warren, MI:Center Line | Clinton Township | Detroit | Eastpointe | Fraser | Grosse Pointe | Hamtramck | Harper Woods | Hazel Park | Madison Heights | Mount Clemens | Roseville | Saint Clair Shores | St. Clair Shores | Sterling Heights


text:
My Uphill Battle Against the Government for Kids' Food Safety
As we are fast approaching the end of 2013, I can't help but reflect on what an amazing and interesting year it's been. I now have a not-for-profit organization called Kids Right To Know, and have been invited to speak in lots of countries. I'm travelling the world spreading the word about freedom of choice and food safety! It's been an incredible experience so far. I've learned so much and met so many interesting people along the way. I have so much to be grateful for and feel so blessed.
This all started with a simple hope in my heart to renew our planet and re-define food safety for Canada. Since we live in a democratic country, I figured that publicly asking for transparency from our government so we could have a better and healthier future was a pretty reasonable request. I still think it's reasonable. We are supposed to be living in a democracy, right? What I didn't realize, was what an uphill battle it would be.
With all the public speeches and interviews I've done so far, I can tell that people really do want to know more about what's in the food they're eating. For the most part, it feels like everyone from everywhere on the planet is working together because everybody wants the same thing -- to be healthier and happier.
I clearly remember at the beginning when I was awakened to the truth about how the biotech companies are genetically modifying much of our food, I was so freaked out. I've been a vegetarian my whole life, so the thought of eating GMO foods that contained the genes of animals, bacteria and viruses was totally wrong to me. Not only because I'm vegetarian, but also because it goes against all laws of nature. If I hadn't done all this research, I wouldn't have had any idea what I was eating! My basic right to know and choose what's in my food seemed to have been taken from me.
Today, not only am I concerned about the actual GMOs themselves (i.e. BT corn), but also about the huge amounts of pesticides required to grow them. To be on the safe side, I try to avoid at all cost foods like sweet corn and other corn products such as high fructose corn syrup, sugar that comes from genetically modified sugar beets, canola, vegetable oil, soy and yellow squash.
Earlier this year, the organization, Canadian Biotechnology Action Network ran random tests of the sweet corn sold in farmers markets, vegetable stands along the road, and in major grocery stores. They concluded that 35 per cent of the corn they tested was genetically modified, and because there are no GMO labels in this country, that means there are people out there who are eating GMOs and don't even know it.
As much as possible, I support organic farmers because I want to support those that are protecting our soil, our health and our future!
This year, I also came to the harsh realization that many of the brands that we trusted and have grown up with are not that trustworthy after all. Brands like Kellogg's, Coke, Frito-Lay, Nestle, PepsiCo, and Kraft have all contributed millions to prevent us from knowing what we're eating.
What's worse is the biotech companies like Monsanto, Bayer and Syngenta are using their money and power to have the masses believe whatever they want.
They do things like fund university studies so they can claim that having more GM crops will solve the problem of world hunger. Not only are they threatening our future with more health problems, but our soil, water, air, and rain forests like the Amazon are also being destroyed. It doesn't look like they're solving world hunger and poverty, it looks like they're contributing to it. Sometimes I ask myself: How do unlabelled GMOs hidden in our everyday packaged products help end world hunger? Or GM Arctic apple, GM salmon, or GM alfalfa for that matter?
On a more positive note, I also had the great opportunity to speak at We Day in Toronto as a TELUS Youth Ambassador. It was this mind blowing, gigantic event that allowed over 20,000 young people to connect and motivate each other to go out in the world and make it a better place.
Another cool and important thing I was involved with was Planet In Focus. It's Canada's largest environmental film festival that took place in Toronto. Here, I was fortunate enough to speak along with Rob Stewart, who came out with the film Shark Water in 2006 and then this year, with Revolution which is incredibly inspiring, and now one of my favourite films of all time. I also got the chance to speak at the screening of GMO - OMG. It was a great opportunity to support this important film and to continue my campaign of raising awareness.
This has been a year of working very hard, without breaks, with little funding, missing a lot of school, and juggling to maintain my grades. But, this is how I've chosen to spend my youth because I want to make a positive change on earth, and be on the right side of history. Knowing that and having all these exciting experiences gives me a kind of joy that I find difficult to describe.
One of my favourite quotes from Rupert Stevens is, "Always leave the earth better than you found it."
So on that positive and inspiring note, I'd like to sincerely thank everyone who's been supporting me and this important movement. I wish you all many blessings for the holiday season. 2014, here we come!
A picture taken on October 9, 2008 shows an ultralight helicopter hovering above a field where Greenpeace activists and Austrian organic farming association BIO AUSTRIA wrote the message 'NO GMO' (Genetically Modified Organism) by planting light green coloured organic buckwheat in a field of organic peas in Breitenfurt, some 60 kms south east from Vienna. (DIETER NAGL/AFP/Getty Images)
Thirty-five tons of corn put by Greenpace activists at Mexico City's Zocalo Square as a protest against the sowing of transgenic corn, form a map of Mexico on February 26, 2009. (Ronaldo Schemidt/AFP/Getty Images)
People walk on a plateform past an advert against genetically modified (GMO) food on February 15, 2011 at a subway station in Paris. (MIGUEL MEDINA/AFP/Getty Images)
Greenpeace activists demonstrate against genetically modified organisms (GMOs) on November 24, 2008 in front of EU headquarters in Brussels. Greenpeace called on the European Union to suspend the authorization of GMOs until the EU is capable of evaluating the risks they pose. (DOMINIQUE FAGET/AFP/Getty Images)
Greenpeace activists stand a protest in front of Los Pinos presidential residence in Mexico City against the farming of transgenic corn in Mexico, on June 26, 2009. (ALFREDO ESTRELLA/AFP/Getty Images)
A Greenpeace activist impersonating Brazil's Chief of Staff Dilma Russeff takes part in a protest against the authorization to grow transgenic rice during a meeting of the National Biosecurity Technical Commission (CYNBIO) at the Science and Technology Ministry in Brasilia October 15, 2009. (JOEDSON ALVES/AFP/Getty Images)
Greenpeace activists distribute samples of transgenic rice as part of a protest against the authorization to grow transgenic rice during a meeting of the National Biosecurity Technical Commission (CYNBIO) at the Science and Technology Ministry in Brasilia October 15, 2009. (JOEDSON ALVES/AFP/Getty Images)
The logo of French 'Les faucheurs volontaires' (Volunteer trimmers of GMO) is seen as demonstrators stand in front of the booth of French union 'la confederation paysanne' (farmers union) during an action against GMO at the International Agricultural Fair on March 6, 2010 in Paris. The European Commission authorised, on March 2, the cultivation of a genetically modified potato, developed by BASF, the first such green light for 12 years. The issue of so-called 'frankenfoods' has long been a matter of fierce debate in Europe and the commission stressed that the Amflora potato in question would be able to be grown only for 'industrial use' including animal feed, rather than for human consumption. (BERTRAND LANGLOIS/AFP/Getty Images)
A couple waves after a parody of union between German chemical giant BASF (L) and the European Food Safety Authority (R) - Autorite europeenne de securite des aliments- (EFSA) during the International Agricultural Fair on March 6, 2010 in Paris. (BERTRAND LANGLOIS/AFP/Getty Images)
A giant banner depicting a farm, is seen as Greenpeace activists hold banners to protest against the genetically modified (GMO) food production in front of the parliament building of Budapest on February 10, 2010. (ATTILA KISBENEDEK/AFP/Getty Images)
A grey-cow is pictured near Greenpeace activists in traditional Hungarian costume standing in front of a giant banner depicting a farm as others hold a banner reading 'GMO-free Europe' to protest against the genetically modified (GMO) food production in front of the parliament building of Budapest on February 10, 2011 during a demonstration. (ATTILA KISBENEDEK/AFP/Getty Images)
Greenpeace activists hold a banner to protest against the genetically modified (GMO) food production in front of the parliament building of Budapest on February 10, 2010. (ATTILA KISBENEDEK/AFP/Getty Images)
A man dressed up as a bee holds a placard during a demonstration organized by French Professional Beekeepers Federation (FFAP) to protest against the use of pesticide on September 14, 2011 along the Saint-Bernard quay in Paris. (JACQUES DEMARTHON/AFP/Getty Images)
Anti-Genetically Modified Organisms (GMO) demonstrators protest in front of Colmar courthouse on September 28, 2011, eastern France, during the trial of 60 militants accused of destroying MGO plants. (FREDERICK FLORIN/AFP/Getty Images)
An anti-GMO activist holds a banner reading 'Science without conscience is but the ruin of soul' during an action to call for the ban of the 'MON 810', a variety of genetically modified maize (corn) developed by Monsanto Company on January 23, 2012 at a Monsanto storehouse in Trebes near Carcassonne, southern France. (ERIC CABANIS/AFP/Getty Images)
Prop 37 in California proposes that genetically modified food be labeled "GMO". If you knew your food was genetically modified, would you still eat it?
Follow Rachel Parent on Twitter: www.twitter.com/RachelsNews


text:
Nagoya Medical Center, Nagoya, Japan
PURPOSE: The aim of this study was to compare the diagnostic yield of endobronchial ultrasound-guided transbronchial needle aspiration (EBUS-TBNA) and transbronchial lung biopsy (TBLB) in patients with stage I/II sarcoidosis.
METHODS: A total of 62 patients with suspected stage I/II sarcoidosis were included in this prospective study. EBUS-TBNA was performed (2 lymph nodes, 2 needle passes for each lymph node), followed by TBLB (5 biopsies for plural lung segments) in the same setting. The final diagnosis of sarcoidosis was based on clinicoradiological compatibility and pathological findings.
RESULTS: EBUS-TBNA was performed in all 62 patients enrolled, while TBLB was performed in 60 patients, since the procedure was terminated in the middle of EBUS-TBNA because of a severe cough in one patient and at the initial attempt of TBLB because of moderate bleeding in another patient. Fifty-four patients were given a final diagnosis of sarcoidosis. Four of the residual patients had other diseases (2 tuberculosis, 1 lymphoma, 1 IgG4-related lymphadenopathy) and 4 were indefinite. The diagnostic yield of EBUS-TBNA and TBLB by showing non-caseating epithelioid cell granuloma was 94% (stage I, 97%; stage II, 88%) and 37% (stage I, 31%; stage II, 50%), respectively. The difference was statistically significant (p<0.001). One pneumothorax and 3 moderate bleeding cases resulted from TBLB.
CONCLUSION: EBUS-TBNA is accurate and safe for the diagnosis of stage I/II sarcoidosis. This procedure is a useful alternative to TBLB in patients suspected of having sarcoidosis.
CLINICAL IMPLICATIONS: EBUS-TBNA may be a useful alternative to TBLB in the diagnosis of stage I/II sarcoidosis.
DISCLOSURE: Masahide Oki, No Financial Disclosure Information; No Product/Research Disclosure Information
Become a CHEST member and receive a FREE subscription as a benefit of membership.
Individuals can purchase this article on ScienceDirect.
Individuals can purchase a subscription to the journal.
Individuals can purchase a subscription to the journal or buy individual articles.
Learn more about membership or Purchase a Full Subscription.
Institutional access is now available through ScienceDirect and can be purchased at myelsevier.com.
Some tools below are only available to our subscribers or users with an online account.
Download citation file:
Web of Science® Times Cited:
Customize your page view by dragging & repositioning the boxes below.
Enter your username and email address. We'll send you a reminder to the email address on record.
Athens and Shibboleth are access management services that provide single sign-on to protected resources. They replace the multiple user names and passwords necessary to access subscription-based content with a single user name and password that can be entered once per session. It operates independently of a user's location or IP address. If your institution uses Athens or Shibboleth authentication, please contact your site administrator to receive your user name and password.


text:
Sportful Tinkoff Saxo Bodyfit Pro Race Jersey
The Sportful Tinkoff Saxo Bodyfit Pro Race is Sportful's race ready warm weather jersey in its team colors. As the name suggests, the jersey fits close to your skin for excellent aerodynamics and moisture wicking. Sportful originally designed the BodyFit Pro Race Men's Cycling Jersey for the riders of Tinkoff Saxo, but it's now being served up for general consumption. If it's good enough to wear during the grand tours, you can bet it's fast, cool, and comfortable. The main body fabric is Dry Pro Lite. This is a lighter version of Sportful's outstanding Dry Pro fabric, which is known for its breathability and incomparable moisture management. The Lite Version is perfect for warm weather rides. Aero Stretch mesh shoulders have been wind tunnel tested, so they've been proven to be aerodynamic as well as breathable and moisture wicking. It dries quickly, too, so it's a good option even on warm and rainy days. The BodyFit's fabric was woven with titanium dioxide, a microscopic metal fiber that reflects sunlight, shielding you from the direct rays that hurt your skin and sap your energy. Three stretchy rear pockets hold bottles and gels, and the full length zip lets you cool down during grueling climbs.
|Regular Price
Copy the following string into an e-mail to firstname.lastname@example.com to request support.
CCBot/2.0 (http://commoncrawl.org/faq/)
Blog Feed
Follow on Twitter
Become a Facebook Fan
Similar Gear


text:
TouchART is a painting tool that lets you turn your photos to Masterpieces.(1) Load an image from your existing Photo Albums.(2) Use one of 4...$0.99
8 Note Polyphonic Music Sampler, with 32 preset and 16 user sample memories. Keyboard is fully polyphonic, allowing proper finger slides and can be...$1.99
Create drawings for business and technical uses.Free
Learn how to use features included in Access, Excel, Outlook, PowerPoint, Publisher, and Word.Free to try
Enjoy 24 full-color images of the American outdoors on your desktop.Free
Play and control your music.Free
Are you an aspiring DJ, and wish you had a simple app to output samples on your Apple device? Look no further than this FREE app!Use this app to...Free
Use your TV card to capture EPG and channel data from live TV broadcasts.Free
audio unit real-time reverse delay effectPaid
Are you an aspiring DJ, and wish you had a simple app to assign and play custom samples? You need look no further than this app!**IMPORTANT: If you...$4.99


text:
Separate names with a comma.
Discussion in 'Cat Chat' started by HeartofClass, Feb 18, 2012.
And how much did it cost?
Stud fee Does that count
Actual item must be their cat tree but I honestly don't remember how much I paid for it now - probably around £40 - £50. I think it was on offer at Zooplus when I bought it.
thats something no one what to think about haha i got rusty a 2 seater sofa from ikea £339 ... yes i am stupid not rich!
I can tell you the most expensive thing I nearly bought...
Having decided that I wanted to do more shows and that I might like to spend the whole weekend away we did look into campervans
But at £25,000 that was a luxury we could manage without, shame really as some of them are so well equiped and I would of loved to take the cats away for a few days.
I saw sense just before I went into debt for my darling pussy cats:biggrin5:
Two sets of Purrfect fencing (one freestanding, one existing fence kit for down the driveways etc )
Cat Fence: Purrfect Cat Enclosures and Cat Fences
Cost ...... approx £1500 (it used to cost more than it does now ! Typical :crazy: )
Worth every penny though to keep my babies safe
Haven't gotten to it yet but it will be taking all three back to Aus with me
Likewise - my two will hopefully be jetting off with us within the next 12-18 months - all depends on how long hubby's visa takes - I don't need one and the cats are easy compared to his.
So far its the cat tree (if you dont count the food that has gone to the RSPCA!!)
But my plan is for a cat run being built this summer which will definitely outprice the cat tree - I have all the plans drawn up already - poor OH :lol:
How much did you pay for the stud fee, if I may ask?
I spent £50 (60) on the chest and storage boxes to make Ari's toilet. Worth every penny, we both love it .
smudge's cat tree was the most expensive for me.. it was around £65 - £70
I bought chloe the most precious gift of all.
After loosing her best friend Harley to HCM. I found a little friend for her. Here he is!! Archie!
He cost me £430 + £78 in fuel to him and get him checked over by a vet.
He's been with us for 3 weeks now and she's playing with him, washing him and play fighting.
It's took along while to get her to eat properly again but that happened just 2 days ago.
My Catteries,
Timber to build, Under floor heating, Internal Thermostatic Heating, Lighting, An electrician Company for three days to fit electrics etc.A plumber for the day, Grooming equipment, Pvc to line all walls, Furnishings for each individual Cat. Their own washing machine, Hoovers, Pet Carriers
Total Cost not including Cats Approx £7000 Spent would be more but I am handy with my hands so built myself apart from electrics and Plumbing
I just bought one of these eBay - The UK's Online Marketplace , not a huge amount by a lot of peoples standards but its the most Ive ever spent on the cats in one purchase . I cant wait for it to arrive now, they will go mad when its built up.
Apart from the £1000 on new windows , I bought her a great Kalven cat tree for just over £60.
I pay £200. Not that expensive compared to some but I am very pleased with the kittens we have from the boy I use. He is a UK Imperial Grand Champion and absolutely adorable too :001_wub:
Got sucked in to spending £59 on this 'Cat Mountain' on Zooplus Cat Mountain - Bargain Cat Toys at zooplus
along with some Bozita and other cat toys. Felt a little splurge was necessary as way of reparation for the recent neutering! Hope he likes it when it comes
Would also like a little Silver Spotted Sister for him to play with at some point, that will be the biggest pay out no doubt (if I manage to twist my bf's arm )
I have a Kalvin cat tree too but mine cost 80 something I cannot remember as it is about 4 years old and still looks like new.
Viv xx
Just had a look on Kalvins site and it is the QBcat range and it is 41c and it is £89 x
I bought Molly a baby brother, she was chuffed to pieces on the amount of money I spent on her :lol:
On a serious note The cat tree was the most expensive ..... £70.
I seem to have spent the same as everyone else, cat tree's etc, but my kitten has cost me thousands in damage goods and vet bills... does that count?????
yes I said thousands............ and still the cost goes up............she has to be the most expensive kitten ever................


text:
Economic Evolution: An Inquiry Into the Foundations of the New Institutional Economics
€ 242,99
Lieferbar innert 2 Wochen
Oktober 1995
BeschreibungThe new institutional economics offers one of the most exciting research agendas in economics today. Yet can it really explain processes of economic change? Economic Evolution explores three of the main approaches within the new institutional economics: * the new theory of the firm, * Nelson and Winter's evolutionary economics * game theoretic accounts of spontaneous evolution.Close analysis reveals that the approaches differ on such fundamental issues as the meaning of terms like institution' and evolution'. However, the book also uncovers two evolutionary mechanisms that govern processes of economic change in all of these approaches.
Pressestimmen"I think this is a wonderful book. The author covers a wide range of literatures, and discusses each with sophistication and subtlety. I know most of these areas very well, and . . . by and large I am in basic accord. More, I learned a lot from what he had to say."
-Richard R. Nelson, Columbia University
Untertitel: 'Communication and Society'. Sprache: Englisch.
Verlag: ROUTLEDGE CHAPMAN HALL
Erscheinungsdatum: Oktober 1995
Seitenanzahl: 256 Seiten
Format: gebunden


text:
Henry King Ketcham
|Also Known As:
|Seattle, King County, Washington, United States
|Died in Del Monte Forest, Monterey County, California, United States
|Cause of death:
|heart disease and cancer
|Immediate Family:
Son of Weaver Vinson Ketcham and Virginia Emma Ketcham
|Managed by:
|Private User
|Last Updated:
Historical records matching Hank Ketcham
Immediate Family
<private> Praepostspouse
<private> Ketchamchild
<private> Kecham-Rameschild
<private> Stevensspouse
<private> Ketchamchild
<private> Ketchamchild
About Hank Ketcham
Henry King "Hank" Ketcham (March 14, 1920 – June 1, 2001) was an American cartoonist who created the Dennis the Menace comic strip, writing and drawing it from 1951 to 1994, when he retired from drawing the daily page and took up painting full time in his studio at his home. He received the Reuben Award for the strip in 1953. The strip continues today in the hands of other artists.
Early life
Hank Ketcham was born in Seattle, Washington. He was the son of Weaver Vinson Ketcham and Virginia King. His great-grandfather was James Weaver, who ran for President two times on third party tickets in the late 19th century. When he was 6 years old, his father had a guest over for dinner who was an illustrator. After dinner, he showed Hank his "magic pencil" and drew some illustrations. Hank was immediately hooked and soon his father set up a small desk in the closet of his bedroom at which he could draw. After graduating from Queen Anne High School in 1937, Hank attended the University of Washington but dropped out after his first year and hitchhiked to Los Angeles hoping to work for Walt Disney.
Hank Ketcham started in the business as an animator for Walter Lantz and eventually Walt Disney, where he worked on films such as Fantasia, Bambi, and Pinocchio. During World War II, Ketcham worked as a photographic specialist with the US Navy Reserve. Also while in the Navy he drew a cartoon called "Half Hitch". After World War II, he settled in Carmel, California, and began work as a freelance cartoonist.
In 1951, he started Dennis The Menace, based on his own 4-year-old son Dennis Ketcham. Ketcham was in his studio in October 1950, when his first wife, Alice Mahar, burst in studio and complained that their 4-year- old, Dennis, had wrecked his bedroom instead of napping. "Your son is a menace," she shouted. Within five months 16 newspapers began carrying the adventures of the impish but innocent "Dennis the Menace." By May 1953, 193 newspapers in the United States and 52 abroad were carrying the strip to 30 million readers.
He made his first journey abroad, for an exchange of cartoons, to the Soviet Union in 1959. Learning of this trip, the Central Intelligence Agency enlisted him to draw anything that could be of use to the United States during those cold war days. If he saw something he would draw it in his sketch book, and if the flight attendant would happen to walk by, he would draw a big nose and eyes to disguise the sketch into a funny face. According to his recollection this resulted in a sketch book full of funny faces and undecipherable sketches.
Ketcham's first wife Alice Louise Mahar died in 1959 of a drug overdose. Hank and Alice were separated at the time of her death. Ketcham married for a second time to Jo Anne Stevens and moved with her and Dennis to Geneva, Switzerland, where he lived from 1960 to 1977, while still producing Dennis the Menace. This marriage ended in divorce. In 1977, he moved back to the United States and settled in Monterey, California with his third wife the former Rolande Praepost, whom he had married in 1969, and had two children, Scott and Dania. Ketcham and his son Dennis drifted apart, and were estranged for much of Dennis's adult life.
Later Life and Retirement
When his Dennis The Menace comic became more than a daily page, Ketcham hired his friends Al Wiseman (a cartoonist) and Fred Toole (a writer) to produce the color Sunday strips and also the many Dennis The Menace comic books that were published. There were always writers who contributed to Dennis the Menace. People from around the country sent captions to him in the mail and he would go through them and find one that he liked and draw a comic to match it.
When he retired from drawing the daily page, Ketcham's former assistants, Marcus Hamilton and Ron Ferdinand, took over drawing the strip. At the time of Ketcham's death it was distributed to more than 1,000 newspapers in 48 countries and 19 languages, by King Features Syndicate.
Ketcham spent his last years in peaceful retirement in his home in Carmel, California, painting many originals in oil and watercolor. Many of his fine paintings can be seen in a hospital in nearby Monterey, California. In this period he also wrote a memoir The Merchant of Dennis the Menace. Also, Fantagraphics Books published the complete Dennis by Ketcham from the start of the strip, in thick volumes collecting two years per book.
Ketcham died of prostate cancer on June 1, 2001. He was survived by his oldest son Dennis, his third wife, Rolande, and their two children Dania and Scott.
Hank Ketcham's Timeline
March 14, 1920
Seattle, King County, Washington, United States
June 1, 2001
Age 81
Del Monte Forest, Monterey County, California, United States


text:
How to Unlock the Whole Map on "Grand Theft Auto: San Andreas" for PS2?
"Grand Theft Auto: San Andreas" has three large and distinct land masses that are all eventually available to the player. San Fierro and Las Venturas have to be unlocked through game missions, but ...
Read More »
How to Start a Fire in Grand Theft Auto: San Andreas?
Learn how to start 5 kinds of fires In GTA:SA.
How to Date a Girl in Grand Theft Auto: San Andreas?
In Grand Theft Auto: San Andreas, the player can find and date a number of girls across the game map. While some are necessary to complete missions, each girl comes with a variety of perks and bene...
Read More »
Cheats for Grand Theft Auto San Andreas for the Xbox?
Grand Theft Auto: San Andreas is a video game created by Rockstar North. It is a part of the the "sandbox" game genre, in which your game character is able to roam the game world freely. Grand Thef...
Read More »
How to Get the BioHazard Alert Mod on "Grand Theft Auto: San Andreas"?
Released for the PC in 2005, "Grand Theft Auto: San Andreas" introduced the world to Carl C.J. Johnson, a street thug who rises from lowly beginnings to become one of the most wealthy and powerful ...
Read More »


text:
Hey ladies and Gents,
My name is Joshua Ray Watson. I have decided to make a leap and go against all odds and further my education in Graphic design and drafting. I have done plenty of sketches in my first few Rapid Visualization classes. I know this is only the beginning for me ( but still very exciting ) but If anyone could shout out to me some pointers, some good ways to excel at my sketches, any good learning tools out there? Good quality but slightly cheap charcoal pencils, anything. I am so intrigued by this program and I see a future in this for me and I could not be more excited. I am brand new to this Society and would like to meet some talented folks and get some insight from some veterans!
Thanks so much,
Joshua Ray Watson


text:
ED Magedson – Founder
Ripoff Report
718 Motoring7209 Queens Blvd Flushing, New York United States of America
Does your business have a bad reputation?
Fix it the right way.
Corporate Advocacy Program™
This report was posted on Ripoff Report on 01/22/2012 02:24 PM and is a permanent record located here: http://www.ripoffreport.com/reports/718-motoring/flushing-new-york-11377/718-motoring-nationwide-auto-painting-took-my-money-unauthorized-installation-burned-u-826733. The posting time indicated is Arizona local time. Arizona does not observe daylight savings so the post time may be Mountain or Pacific depending on the time of year.
Ripoff Report has an exclusive license to this report. It may not be copied without the written permission of Ripoff Report. READ: Foreign websites steal our content
Click Here to read other Ripoff Reports on 718 Motoring
If you would like to see more Rip-off Reports on this company/individual, search here:Search Tips
In order to assure the best results in your search:
Advertisers above have met our
strict standards for business conduct.


text:
Medialuna de Osorno
Coordinates: 40°34′35″S 73°10′39″W / -40.576298°N 73.177636°W
La Medialuna de Osorno is the rodeo stadium of Osorno, Chile.
Rodeo is Chile's official sport, and uses a specialized stadium known as a medialuna (literally "crescent"). Chilean rodeos are not quite the same sport famous in the American West; they involve two riders on horseback trying to herd a bull around a circular arena, attempting to pin him against several large cushions.
The Medialuna de Osorno was the first covered medialuna in Chile, and is considered one of the highest quality. Rodeos are organized by the Club Osorno René Soriano Bórquez. It boasts a 64-meter diameter arena, seating capacity of approximately 4,800, and an in-house casino.
In 2006, the medialuna was the qualifying arena for the Southern Region of the Campeonato Nacional de Rodeo, the nation-wide Rodeo competition.
See also
- Osorno, Chile
|The above article was imported from Wikipedia.org on 08/24/2010 and may be a modified version of the Original Wikipedia article. See this article's history page for a list of revisions which may have occurred after import. This article is displayed here courtesy of the Wikimedia Foundation, Wikipedia, and its authors/contributors in compliance with the Wikimedia Terms of Use Agreement. This article was imported and is licensed under the terms of the Creative Commons Attribution/Share-Alike License 3.0 (CC-BY-SA). Clicking on photos, videos, or drawings in this article will display copyright and license information for that non-text media where available.


text:
Launched in 2015 by the Colorado State Library (CSL) and the Colorado Library Consortium (CLiC), the Research Institute for Public Libraries (RIPL) is a singular event for public library leaders and others interested in public library data and evaluation. In this immersive, bootcamp-style event, participants learn practical, strategic methods of gathering, analyzing, and using data for planning, management, and communicating impact.
RIPL 2015 and 2016 drew participants from around North America who convened in Colorado for three days of experiential learning.
What's next? Thanks to the generous support of the Institute of Museum and Library Services (IMLS), we will be taking RIPL on the road in 2017 and 2018! Our IMLS grant is funding a series of two-day, state/regional events around the United States in 2017 and 2018 – the RIPL Regionals. These are scaled-down versions of the national data boot camp, but provide the data and evaluation training necessary to begin using data to plan for your library's future.
Interested in attending the larger, national event? The next one will occur in Summer 2018 in Atlanta, Georgia.
|Event Type*
|Host (in parternship with CSL and CLiC)
|March 20-21, 2017
|RIPL Regional
|Northeast Dade-Aventura Branch Library, Aventura, Florida
|April 10-11, 2017
|RIPL Regional
|California State Library, Sacramento
|July 31-August 1, 2017
|RIPL Regional
|Colorado Springs, CO
|Colorado State Library
|August 14-15, 2017
|RIPL Regional
|Newry, Maine
|Maine State Library
|October 30-31, 2017
|RIPL Regional
|Arlington, Texas
|Texas State Library and Archives Commission
|April 18-19, 2018
|RIPL Regional
|Utica, New York
|New York State Library
|Summer 2018
|Atlanta, Georgia
|Georgia Public Library Service
* RIPL Regional: 2 days, 3 instructors, 50 participants from state/surrounding region
* RIPL: 3 days, 15+ instructors, 110 participants from around the United States and beyond
RIPL participants work in public libraries and are …
interested in getting started using data for savvy and strategic planning.
looking for both inspiration and instruction in a hands-on, participatory environment.
seeking to learn about outcomes and how to measure library impact.
committed to leading their organizations in making data-based decisions.
eager to develop a peer network to support research and evaluation efforts.
Want to connect with others interested in public library data and evaluation? Sign up for PL-EVAL, a mailing list where you can ask questions, share ideas, and learn from experiences across the field.


text:
Share house
Share house
3 Bedrooms
3 Beds
1 Bathrooms
1 Baths
2 Flatmates
2 Flatmates
|Room Type
|Private room
|Shared bathroom
|Flexible with furnishings
|Length of Stay
|Anyone welcome
|Weekly rent
|2 weeks rent
|Not included in rent
|Available but not included in rent
|Off street parking
The property has a big backyard and big deck which is great for entertaining. The people who have and do live here are very social but also respect each others privacy. The house has a huge TV with great entertainment system also.
One of the occupants is an Army member and one is a carpenter both of which work 5 days a week during normal business hours. Both of us enjoy being social and maintain a rather healthy lifestyle.
|Appleby Rd at Quandeine Street, stop 34
|Close by
|Appleby Rd at Reuben Street, stop 33
|Close by
|Appleby Rd at Stafford North, stop 34a
|Close by
|Minimine St at Dunedoo Street, stop 33
|~ 4 min walk
|Stafford Rd at Victor Street, stop 32
|~ 5 min walk
|Stafford Rd at Shand Street, stop 33
|~ 5 min walk
|Appleby Rd at Allowrie Street, stop 35
|~ 6 min walk
|Stafford Rd at MacNaughton Street, stop 34
|~ 7 min walk
|Redwood St at Farrant Street
|~ 7 min walk
|Eetlust Catering
|~ 5 min walk
|Ottoman Doner Kebab
|~ 7 min walk
|BB's Café
|~ 9 min walk
|Breads N Curries
|~ 9 min walk
|Stafford Sandwich & Carvery
|~ 9 min walk
|Inakaya Jananese Resturant
|~ 9 min walk
|Le Le Chinese Fastfood
|~ 9 min walk
|Humpybong Espresso
|~ 10 min walk
|Haven Espresso House
|~ 10 min walk
|Gloria Jean's Coffees Stafford
|~ 11 min walk
|Rosetta Sunsmile Cafe
|~ 11 min walk
|Red Rooster Stafford
|~ 11 min walk
|ALDI Stafford
|~ 9 min walk
|Healthy Life Stafford
|~ 9 min walk
|Woolworths Stafford
|~ 11 min walk
|IGA X-press Stafford
|~ 15 min walk
|Waterama-Gourmet Water
|~ 20 min walk
|Stafford Road Fresh Pty Ltd.
|~ 25 min walk
|Coles Supermarkets
|~ 26 min walk
|Rode Fresh
|~ 28 min walk
|Coles Express Stafford Heights
|~ 28 min walk
|Woolworths Everton Park
|~ 28 min walk
|Charlie's Fruit Market
|~ 29 min walk


text:
Deluxe 2 board carrier protects, stabilizes and secures your surfboard to your vehicle
(based on 14 reviews)
of respondents would recommend this to a friend.
Ratings Distribution
5 Stars
4 Stars
3 Stars
2 Stars
1 Stars
Best Uses
Reviewed by 14 customers
Displaying reviews 1-3
Back to top
Previous | Next »
Doesn't Fit Well on Aerobars
By Dan
from Boston, MA
Comments about 554XT Hang-Two Surf Carrier:
I was extremely frustrated with this purchase. After doing much research on which surfboard carrying options were compatible with my new Aerobars, I picked this one for it's appearance of simplistic and intelligent design at a good price. Unfortunately, Thule does not indicate that these adapters are not designed whatsover to fit onto the new Aerobar design. The screw clamp design on the bottom naturally slides down toward the tapered side of the bars (doesn't stay centered), the screws scratch the aerobars when tightening because the bars are so wide, and the bracket damages the rubber on top of the aerobars when tightened. If you own the Aerobars, look elsewhere for a solution to carry your surfboards.
Bottom Line No, I would not recommend this to a friend
Was this review helpful? Yes / No
- You may also flag this review
(1 of 2 customers found this review helpful)
fast, easy and secure
By docjmsa
from I.H.B., FL
I have had 2 sets for 3 years now and they live almost 12 months out of the year on my roof. The one set I use the most is starting to deteriorate though and leave rubber marks on my boards (I wrapped them with electric trape now). I mostly use them to transport 14' and 16' prone paddleboards locally, throughout Florida and for Florida to NY runs in the summer. VERY secure driving 90 mph. Just got SUP raceboard and straps are too short for 28" 14' board. Bummer. Also- had one of the plastic clips crack a while back so have to "wing it" for one strap. Would like longer straps (8 inches) and be able to buy replacement clips- seems a waste to replace a whole strap when it is just the clip. WOULD BE ECSTATIC IF I COULD BUY STRAPS THAT ARE 8" longer.
Bottom Line Yes, I would recommend this to a friend
SUPs BEWARE!
By Demon
from Lake Tahoe, CA
Dont plan on mounting anything wider than 29 inches. The straps are way too short!
Find spare parts for this product.
Thule is dedicated to providing exceptional products that are quality tested and guaranteed against defects in materials and workmanship.
Two 15-foot heavy-duty straps with cam-action buckles secure heavy loads while our patented buckle bumpers help to prevent vehicle scratches and dings.
Get the extra height you need to load and unload your gear with the Step-Up™ Wheel Step
You will be directed to the Thule Towbars Fit Guide. If you're not automatically redirected within 5 seconds,


text:
Rusk's Deep Shine: A Quick Way to "Fake" Your Way to a Good Hair DayWednesday, October 27, 2010
See those 2 products? They've been helping me fake my way to a good hair day for a bit now, and I needed to share them with you.
On the left you can see Deepshine Lustre Shine Enhancing Lusterizer. Yes, that's a lot of Lustre. It's a creamy lotion that you can put in your hair wet or dry to help make hair soft, shiny and add a little bit of separation. I've been loving it on my dry hair, as the last step in hair styling. Literally I can dry my hair (paying no attention to making it straight or getting rid of frizz), then apply about a dime sized amount of this to my hair. Distribute it really well, and sometimes I'll even brush it through. Suddenly my hair will look like I spent a huge amount of time drying and styling it! Shiny, frizz free, my long layers have a bit of separation (which I love) and everything is super soft.
On the right is Deepshine Oil Protective Oil Treatment. Similar to other hair oils, this oil is mostly Argan oil with a very light fruity/herbal smell. I like that it comes in a bottle with a very small squeeze top opening- hard to turn yourself into a grease ball! I usually put about a nickel sized amount in my hair when wet, making sure that I evenly distribute it (concentrating on the ends of my hair and avoiding the roots) and I often will comb it through using a wide tooth comb. Dry and style as usual. It helps with shine, softness and makes hair super soft!
I've been combining both of these products (Oil on wet hair, then dry, apply Lusterizer Creme as a last styling step) and my hair has been loving it! I'm frizz free, shiny and my hair is super soft.
Rusk Hair Products
No comments
I love comments! Please ask away, provide info on how you liked something, etc. Note that spam, comments with random links (which I count as spam), anything not in english (again, spam) and comments that are completely unrelated to anything will all be deleted.
Subscribe to: Post Comments (Atom)


text:
Contact us 24/7: +1 877 678 9627
View product details
Zoom In
- - True to size
- - Relaxed fit
- - Semi-sheer finish
- - Model is 177cm/ 5'10" and is wearing a size XSmall
In semi-sheer burnout linen-jersey, J.Crew's V-neck tee will give your basics collection a boost. The perfect partner to earthy hues, team this pale-green style with a camel skirt and taupe wedges.
Shown here with: Mallarino necklace, Bodas top, Yves Saint Laurent cuff, Roberto Cavalli ring, MiH Jeans skirt, Miu Miu shoes, Chloé bag.
- J.Crew T-shirt: pale-green semi-sheer burnout linen-jersey, V-neck, short sleeves, patch pocket. Slips on. 100% linen. Hand wash. Designer color: Mineral Green.
Product Code: 112975
Shop more:
For alternative suggestions, contact our Fashion Consultants
Help & Advice
Product Code: 112975


text:
Kayla Stra
|Kayla Stra
|Adelaide, Australia
|Birth date
|Template:Birthdate and age
|Career wins
|221+ (ongoing)
|Major racing wins, honours & awards
|Major racing wins
|City of Marion Stakes (2005)
Kayla Stra (born December 3, 1984 in Adelaide, South Australia) is a jockey in Thoroughbred horse racing who raced in Australia until coming to compete in the United States at racetracks in California. She currently rides in the Northern California circuit after a 2 year stint in the Southern California area.
Kayla Stra was born in Australia, where she launched her career in horseracing prior to moving to California in Late 2007. From a very young age, Stra was interested in horses, having talked her parents into buying her a pony when she was eight years old. During her late childhood and adolescence, Stra worked at racing stables and eventually bought her first horse — a Thoroughbred named Gurtie, which she trained on her own for picnic races (unregistered race horses) before getting her certificate in racing.
Stra acknowledges her first trainer, Ray Moore, as someone who has had a strong influence in her life. Moore taught Stra how to be a horseman — how to communicate with horses by reading their body language and having a keen feel for what they're thinking. Stra credits John Letts as one of her mentors for his outstanding jockey career, having won three Melbourne Cups and hundreds upon hundreds of stake races.
As an apprentice, Stra was always in the top five riders and won all her premierships. During this time, she began traveling to different tracks to learn more from those experiences.
Stra eventually racked up approximately 500 victories in her native country and became the "poster girl" for Australian horseracing. Now, she hopes to continue that success in the much larger US market. Racing in California, on November 9, 2007 Kayla Stra won her first American race aboard Flying Bearcat at Hollywood Park Racetrack. One notable victory was at Santa Anita on 49-1 longshot Paddin' Mud. Stra's career goal to date is to hang in the game and not let the industry down. But here, she will face the toughest competitors in the world — serious professional athletes who are not likely to cut any slack for the new girl.
Stra became a leading Adelaide apprentice jockey who posted 220 winners in Australia. Her biggest Australian win was in the 2005 City of Marion Stakes with gelding Navy Shaker.
Stra is one of the jockeys featured in Animal Planet's 2009 reality tv show, Jockeys. It lasted for two seasons.
After two years of the lack of wins in the Southern California circuit, Stra decided to leave the Southern California circuit in October 2009 after two years. In October 2009, she joined the Northern California area. In her first season at Golden Gate Fields' fall meet she finished 10th in the standings. The Northern California Circuit is where she continues to ride their today.
Outside of horseracing, Stra enjoys the company of her close friends and family (including all animals) and focusing on her dreams.
|The above article was imported from Wikipedia.org on 08/24/2010 and may be a modified version of the Original Wikipedia article. See this article's history page for a list of revisions which may have occurred after import. This article is displayed here courtesy of the Wikimedia Foundation, Wikipedia, and its authors/contributors in compliance with the Wikimedia Terms of Use Agreement. This article was imported and is licensed under the terms of the Creative Commons Attribution/Share-Alike License 3.0 (CC-BY-SA). Clicking on photos, videos, or drawings in this article will display copyright and license information for that non-text media where available.


text:
Please note images are for illustration purposes and may differ from the product(s) you receive
Calvin Klein Forbidden Euphoria Eau de Parfum for women – Sensual, daring scent to charm the senses.
Forbidden is a darker, sexier version of the classic fragrance, Euphoria. Dedicated to young women, this daring scent opens with iced raspberry and tangerine juices, leading to heart notes of tiger orchid, pink peony, and jasmine flowers. A rich base of patchouli, musk and cashmere wood completes the composition.
Perfect to wear day or night.