Carnival to Introduce First Social Network at Sea

20 July 2009

Called the FunHub, Carnival‘s new on-board social networking site can be accessed from provided stations throughout the ship, via your own laptop or other wifi device, or through 10″ netbooks that can be rented while at sea:

The new Carnival Dream will take seagoing technology to a new level with the introduction of the FunHub, a comprehensive shipboard intranet portal featuring the cruise industry’s first onboard social network, along with access to a wide variety of information on the ship’s services, facilities and daily activities. The 130,000-ton vessel, Carnival’s largest ship, is set to debut Sept. 21.

Access to the FunHub will be available via 36 state-of-the-art stations located on decks 3, 4 and 5, including 12 within Ocean Plaza, Carnival Dream’s indoor/outdoor cafe and entertainment venue.

The FunHub locations will provide guests with free and convenient access to an informative ship-specific intranet portal, and an exclusive shipboard social network, both of which will be available on a 24/7 basis. Guests may also access the sites via their personal laptops or via 10-inch netbooks that are available for rent and can be used anywhere onboard.

Carnival Dream’s onboard social network mirrors the experience one finds on other social networking sites. Guests can create a personal profile and use the application to meet and interact with others onboard, send and receive private messages, create groups based on interests, and invite friends to attend shows or participate in onboard events. Guests can also create their own private or public discussion group, inviting others in their traveling party or friends they meet on board to participate.

Designed as a convenient resource for wide-ranging information specific to the Carnival Dream, the intranet portal details the ship’s numerous onboard activities, including entertainment options, daily events and youth programs. Carnival Dream’s extensive food and beverage offerings are showcased with sample menus, hours of operation and more. A filtering application is available to assist guests in planning their day.

The portal also includes weather updates for that day and the next port of call; the latest news and sports scores; biographies of key shipboard personnel; ship and cruise director announcements; fun, interactive polls; helpful three-dimensional ship maps, and a frequently asked questions section.

A year-long collaboration involving Carnival’s hotel operations, marketing, IT and guest experience departments, the Carnival Dream’s onboard social network and intranet portal are available on any guest computer or Wi-Fi enabled device free of charge.


Learn Spring and get certified as a Spring developer

15 July 2009

On Monday, the Core Spring Training + Certification Calendar was published on springsource.org. For under $2500 you get four days of Spring training and a shot at passing the certification test:

During the Core Spring course you will be trained to become an expert in the Spring Framework. After the course you will receive a free voucher to take the SpringSource Certified Spring Professional exam to become officially certified in Spring. For full details, please visit the main training information page. Here is a summary of some of the upcoming Core Spring + Certification courses:

They also have a schedule for Europe, the Middle East, Africa, Asia & Australia.


Google announces plans for its own O/S

8 July 2009

Yesterday, Google announced that it is planning on developing its own computer operating system:

Challenging Microsoft‘s grip on PCs, Internet search giant Google said late Tuesday night that it intends create its own computer operating system.

Google (GOOG) said the OS is initially aimed at netbooks — small, cheap and incredibly popular sub-notebooks — and would be an “open source” project built with and by many developers.

FROM GOOGLE: Company statement on its plans

Google is currently meeting with hardware manufacturers to aprise them of its plans, and hopes to have it on computers by the second half of 2010.

Google has denied for years any interest in taking on Microsoft (MSFT) or Apple (AAPL) with its own operating system, but Tuesday took a new direction.

In a blog post on the official Google blog, Google positioned the new Chrome Operating System as the “natural extension” of Chrome, the Internet browser Google introduced to acclaim in 2008 and which now has 30 million users.


Sears Adopts OpenID Technology

6 July 2009

OpenID goes retail at Sears and Kmart:

Sears Holdings Corp. announced today that it is the first major retailer to launch the Open ID platform for Sears Communities, which will connect over 1 million monthly visitors via MySears and MyKmart sites to major social media.

The OpenID universal login standard enables visitors to consolidate their Internet identity by providing them a single login for all of their online interactions. This is the first step toward enabling customers to log in to Sears communities using their social IDs rather than set up new accounts. This covers the most popular, familiar web sites such as Google, Facebook, MySpace, Yahoo! and Twitter.

Through this new innovation, users in the Sears and Kmart communities can use the ID and password they already have to write product reviews and can share information on products, services and solutions. Future updates planned with the OpenID platform will allow users in the communities to share their posts and product reviews with friends easily via Facebook.

“We’re constantly looking for ways to stay innovative in our online initiatives by identifying and implementing technologies that help our users navigate our communities with ease,” says Rob Harles, Sears’ vice president of community. “Our adoption of the OpenID technology helps simplify our customers’ online experience and ultimately helps us meet our goal of ensuring our customers have the most efficient shopping experience possible.”

MySears and MyKmart community sites are online destinations that give consumers a variety of ways to share in-depth information about products, helping make their purchase decisions easier. Visitors to MySears and MyKmart have the opportunity to write product reviews, post comments on the reviews of others, participate in discussion boards and post ideas for the community to vote on. Customers also have access to special offers and coupons in return for their participation in the community.


Spring Training: Every Second Person for Free!

30 June 2009

Today is the day, if you want to take advantage of this special, but it looks like a pretty good deal …

To celebrate the availability of the Spring Certification Training in six new locations, SpringSource launched another once in a lifetime opportunity.

For every person that registers for a Spring Certification Training in one of the six new locations before July 01, 2009 you get the second person for free!

During this course you will learn to:

  • Work with the Spring Inversion of Control (IoC) Container
  • Effectively use JDBC and Hibernate for data access
  • Use JUnit, Spring, stubs and mocking frameworks to effectively implement automated unit and integration tests
  • Take advantage of Aspect-Oriented Programming (AOP) to keep code clean and maintainable
  • Use Spring Security to secure web and standalone applications
  • Manage live applications with ease using Spring’s support for Java
  • Management Extensions (JMX)
  • Become a SpringSource Certified Spring Professional
  • And much more

This special is offered in the following cities, click on the links below to learn more!

August 11 – 14: Budapest, Hungary
August 11 – 14: São Paulo, Brazil
August 11 – 14: Tel Aviv, Israel
August 18 – 21: Athens, Greece
August 18 – 21: Hong Kong, Hong Kong
August 25 – 28: Buenos Aires, Argentina


SemREST Version 0.1 Released

22 June 2009

The Open Source Release Feed has an interesting announcement this morning:

SemREST Version 0.1 Released – Semantic Extension For Java RestFull Web Services

SemREST is a Java framework for the semantic extension of RESTful Web Services. Some features of the framework include: simplification of data transmission mainly in RDF – but also in other formats (generically requests/responses) for HTTP-operations GET, PUT, POST and DELETE. Simple bijective mapping of RDF graphs and Java instances simple mapping of RDF graphs on Java interfaces (implying automatic interface implementation). Extraction of RDFa data from HTML content (via HTTP GET Request)

Download

Release Notes

Project Website


Opera Unite: a Web server on the Web browser

17 June 2009

Stefan Constantinescu of IntoMobile has an interesting take on the new Opera Unite web browser that comes complete with a built-in web server:

Today Opera launched Opera Unite and with it came a lot of excitement, confusion and questions. Opera Unite is a web server running in an Alpha version of the Opera 10 web browser. This web server can be accessed by anyone on the internet and goes around firewalls thanks to Opera’s proxies. Services can be installed to run on Unite, and at launch Opera has made available a file sharing service, media player, chat service and a few others, to show what this technology is capable of. Opera Unite is, from my knowledge of internet history, the first web server to be bundled and tightly integrated inside a web browser.

The first question that comes to people’s minds is why? Why would I want to run a web server in my web browser?

Lawrence Eng, Product Analyst at Opera Software, talks about the internet’s “unfulfilled promise” of connecting people directly and letting them interact with each other without the need to play in someone else’s sandbox. Why should I have to sign up to Flickr to share photos with Jon, why should I have to install Google (NSDQ: GOOG) Talk to chat with Lisa, why is it that few corporations, who have vast monetary resources, build huge data centers and then expect us to play by their rules in their world?

The devices we use to access the internet today are merely dumb terminals that connect to servers that host the things we care about; but what exactly is wrong with that?

What’s wrong with that? Stefan will exlpain it to you.


JavaFX squares off against AJAX

8 June 2009

This must have been interesting to watch …

Prominent AJAX developers Ben Galbraith and Dion Almaer each take a side in a mock debate over the merits of the two technologies at the JavaOne conference

In a mock debate focused on the rich Internet application development realm, AJAX was pitted against Sun Microsystems’ JavaFX Friday, with proponents for both technologies pointing up their entrant’s high points and the low points of their rival.

A session at the JavaOne conference in San Francisco had the co-founders of the Ajaxian Web site for AJAX technologies squaring off, with Ben Galbraith playing the part of the JavaFX advocate and Dion Almaer serving as AJAX’s proponent. Both serve as co-directors of developer tools at Mozilla. While Galbraith and Almaer are obviously geared toward AJAX, Galbraith said he also has experience consulting on Java.

“JavaFX is built on top of an incredibly mature runtime that gives you amazing performance,” as well great features, and [Oracle CEO] Larry Ellison, Galbraith said, giving a humorous nod to Oracle’s plans to buy Java founder Sun Microsystems.

Almaer focused on AJAX being synonymous with the Web. “It’s all Web stuff that’s going on,” he said.

The two went back and forth, measuring factors such as graphics performance, language capabilities, and tools.


Look-up Tables: Service configuration

4 June 2009

Yesterday, I tossed out a copy of my new LookupTableService without going into much detail about the use of the service or how to go about setting it up. Today, I’d like to correct that and add a little context to the story.

Basically, I wanted to be able to get to table entries, not as they are defined on the database, but as they are configured in the system. This primarily relates to user-defined properties, which are stored on the database as property01, property02, property03, etc, but which have been given certain characteristics by their creator when the look-up table was defined. Such characteristics include things like name and type and length and source and so on, which is how I wanted to get to things, as opposed to property01, property02, and so forth. That’s why you see this little tidbit of code inside of the service:

  /**
   * <p>Returns the requested table entry.</p>
   * 
   * @param tableName the name of the requested table
   * @param entryId the id of the requested entry
   * @return the requested table entry
   */
  private Map<String,Object> buildTableEntry(LookupTable lookupTable, LookupTableEntry lookupTableEntry) {
    Map<String,Object> entry = new TreeMap<String,Object>();

    entry.put("id", lookupTableEntry.getEntryId());
    entry.put("description", lookupTableEntry.getDescription());
    if (lookupTable.getProperties() != null && lookupTable.getProperties().size() > 0) {
      Iterator<LookupTableProperty> i = lookupTable.getProperties().iterator();
      while (i.hasNext()) {
        LookupTableProperty lookupTableProperty = i.next();
        int index = lookupTableProperty.getSequence();
        String name = lookupTableProperty.getName();
        if (StringUtils.isEmpty(lookupTableEntry.getProperty(index))) {
          entry.put(name, "");
        } else {
          entry.put(name, lookupTableEntry.getProperty(index));
        }
      }
    }

    return entry;
  }

The current version just drops the value string into the map at this point, but I have visions of one day using the property’s “type” value to convert the data in to an Integer or Date or whatever object might be appropriate based on the “type” … but I was just too lazy to work all of that out right at the moment.

The service is set up to be configured by Spring, so to make it work, you need to add a little something to your applicationContext.xml file:

<bean id="lookupTableService" class="org.restafarian.core.service.LookupTableService">
  <property name="lookupTableManager" ref="lookupTableManager"/>
  <property name="lookupTableEntryManager" ref="lookupTableEntryManager"/>
  <property name="context" value="${lookup.table.service.context}"/>
</bean>

The service is set up to take advantage of the recent addition of “context” to the Look-up Table framework, so you have to specify which context you want to work with. If you need to access tables from more than one context, say the global context and your application’s specific context, you can simply define an instance of the service for each context required, reusing the same data manager beans for each:

<bean id="globalLookupTableService" class="org.restafarian.core.service.LookupTableService">
  <property name="lookupTableManager" ref="lookupTableManager"/>
  <property name="lookupTableEntryManager" ref="lookupTableEntryManager"/>
  <property name="context" value="global"/>
</bean>

<bean id="applLookupTableService" class="org.restafarian.core.service.LookupTableService">
  <property name="lookupTableManager" ref="lookupTableManager"/>
  <property name="lookupTableEntryManager" ref="lookupTableEntryManager"/>
  <property name="context" value="${my.application.context}"/>
</bean>

Once Spring injects the bean with all of the dependencies and turns it over to your application, then you can just use it to grab tables and table entries as needed:

countryTable = globalLookupTableService.getTable("country");

Now that that is done, I need to get busy putting it to work!


Look-up Tables: LookupTableService

3 June 2009

Most of my usage of the Look-up Table service that we created has been on the client side of things, but ocassionally, I will have a need to reference a look-up table back on the server, or in a stand-alone batch job. To accommodate that, I could utilize the HttpClient library and access the data through the REST interface, but that’s a little overkill when I have access to the data right there via Java. Still, the manager classes in the service layer are not quite designed for the seamless access that I was looking for, so I finally broke down and created a Look-up Table service module:

package org.restafarian.core.service;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.commons.lang.StringUtils;
import org.restafarian.core.beans.LookupTable;
import org.restafarian.core.beans.LookupTableEntry;
import org.restafarian.core.beans.LookupTableProperty;
import org.restafarian.core.manager.LookupTableEntryManager;
import org.restafarian.core.manager.LookupTableManager;

/**
 * <p>This is the LookupTable service.</p>
 */
public class LookupTableService {
  private String context = null;
  private LookupTableManager lookupTableManager = null;
  private LookupTableEntryManager lookupTableEntryManager = null;

  /**
   * <p>Returns a list of lookup tables in this context.</p>
   *
   * @return a list of lookup tables in this context
   */
  public List<LookupTable> getTables() {
    return lookupTableManager.findByContext(context);
  }

  /**
   * <p>Returns a list of lookup table names in this context.</p>
   *
   * @return a list of lookup table names in this context
   */
  public List<String> getTableNames() {
    List<String> tableNames = new ArrayList<String>();

    List<LookupTable> tableInfo = lookupTableManager.findByContext(context);
    if (tableInfo != null) {
      Iterator<LookupTable> i = tableInfo.iterator();
      while (i.hasNext()) {
        tableNames.add(i.next().getTableName());
      }
    }

    return tableNames;
  }

  /**
   * <p>Returns the definition of the requested lookup table.</p>
   *
   * @param tableName the name of the requested table
   * @return the definition of the requested lookup table
   */
  public LookupTable getTableDefinition(String tableName) {
    return lookupTableManager.findByContextAndTableName(context, tableName);
  }

  /**
   * <p>Returns the contents of the requested lookup table.</p>
   *
   * @param tableName the name of the requested table
   * @return the contents of the requested lookup table
   */
  public Map<String,Map<String,Object>> getTable(String tableName) {
    Map<String,Map<String,Object>> table = null;

    LookupTable lookupTable = lookupTableManager.findByContextAndTableName(context, tableName);
    if (lookupTable != null) {
      table = new TreeMap<String,Map<String,Object>>();
      List<LookupTableEntry> lookupTableEntryList =
           lookupTableEntryManager.findByContextAndTableName(context, tableName);
      if (lookupTableEntryList != null && lookupTableEntryList.size() > 0) {
        Iterator<LookupTableEntry> i = lookupTableEntryList.iterator();
        while (i.hasNext()) {
          LookupTableEntry lookupTableEntry = i.next();
          table.put(lookupTableEntry.getEntryId(), buildTableEntry(lookupTable, 
               lookupTableEntry));
        }
      }
    }

    return table;
  }

  /**
   * <p>Returns the requested table entry.</p>
   *
   * @param tableName the name of the requested table
   * @param entryId the id of the requested entry
   * @return the requested table entry
   */
  public Map<String,Object> getTableEntry(String tableName, String entryId) {
    Map<String,Object> entry = null;

    LookupTable lookupTable = lookupTableManager.findByContextAndTableName(context, tableName);
    if (lookupTable != null) {
      LookupTableEntry lookupTableEntry =
           lookupTableEntryManager.findByContextTableEntry(context, tableName, entryId);
      if (lookupTableEntry != null) {
        entry = buildTableEntry(lookupTable, lookupTableEntry);
      }
    }

    return entry;
  }

  /**
   * <p>Returns the requested table entry.</p>
   *
   * @param tableName the name of the requested table
   * @param entryId the id of the requested entry
   * @return the requested table entry
   */
  private Map<String,Object> buildTableEntry(LookupTable lookupTable, LookupTableEntry
         lookupTableEntry) {
    Map<String,Object> entry = new TreeMap<String,Object>();

    entry.put("id", lookupTableEntry.getEntryId());
    entry.put("description", lookupTableEntry.getDescription());
    if (lookupTable.getProperties() != null && lookupTable.getProperties().size() > 0) {
      Iterator<LookupTableProperty> i = lookupTable.getProperties().iterator();
      while (i.hasNext()) {
        LookupTableProperty lookupTableProperty = i.next();
        int index = lookupTableProperty.getSequence();
        String name = lookupTableProperty.getName();
        if (StringUtils.isEmpty(lookupTableEntry.getProperty(index))) {
          entry.put(name, "");
        } else {
          entry.put(name, lookupTableEntry.getProperty(index));
        }
      }
    }

    return entry;
  }

  /**
   * @param context the context to set
   */
  public void setContext(String context) {
    this.context = context;
  }

  /**
   * @param lookupTableManager the lookupTableManager to set
   */
  public void setLookupTableManager(LookupTableManager lookupTableManager) {
    this.lookupTableManager = lookupTableManager;
  }

  /**
   * @param lookupTableEntryManager the lookupTableEntryManager to set
   */
  public void setLookupTableEntryManager(LookupTableEntryManager lookupTableEntryManager) {
    this.lookupTableEntryManager = lookupTableEntryManager;
  }
}

There’s obviously more that could be done here, but for now, it serves its purpose.


« Previous PageNext Page »