Friday, October 29, 2010

CSS Best Practices

By Cesar Olivas

When you start creating a website, you have to make some choices before you start. Some of these choices are using HTML or XHTML, Tables or Divs, Floats or Position, Inline Styling, etc. In this post I will give you some explanation of all the elements that you usually need to choose from.

Doctype
Every website needs to have a doctype declared, failing to do so may result on your page rendered ineffectively. The best way is declaring a doctype like xhtml transitional, strict or html 4.01 and help meet standard requirements. As a personal experience, this has been an issue in SharePoint implementations, since default masterpages do not include a doctype. In a customization, the best way to deal with this is declare a doctype so you can fully transform your site.

External Stylesheets
You shouldn’t have to use the style tag for SEO purposes. Not the end of the world, but it is bad. You should always link to an external stylesheet or stylesheets. For larger projects, you would be better off using a set of stylesheets for different parts of the site, instead of one 10000 lines long stylesheet. It happens, especially of you need to apply hacks for different explorers.

HTML or XHTML
There are some reasons as to why coding should be done in xhtml. First of all: HTML is dead. Html has absorbed lots of xml features and transformed into xhtml. Second of all: XHTML can be read in xml devices, so let’s go ahead and use it.

Tables or Divs
This shouldn’t even be a question, tables are not appropriate for layout purposes, they don’t get along with CSS and they aren’t accessible at all. Having said this, I would not rule out tables 100% all the time (maybe 99.9%). Sometimes you will have to deal with this, and use tables.

Floats or position
CSS layouts will require either floats or positioning. These techniques are used to give the illusion of columns. They both have drawbacks, for example, positioning requires clearing the floats, and positioning limits the flexibility of the layout. Some people would tell that positioning is the way to do it, because it is the oldest way to do it, I personally use floats, since it allows for accessibility if text needs to be resized. With positioning, the layout would break.

Inline Styles
CSS should only be applied using classes and ids. Classes will be the most common way to do it; though I personally use IDs in all my “main” divs that conform the core layout. Using inline styles means that you have to look into the html to make the proper changes, which is really bad, it takes time, and there might be a chance that you can break the page.

CSS Shortcuts
Shortcuts in CSS are great to reduce your code, it can really help you to keep it clean and straight to the point.

CSS Rollovers
CSS has effectively done this really easy for us. Use pseudo classes to accomplish this instead of javascript!. There are lots of techniques around, look for them, or develop your own.

Good Coding
There are different ways of doing that. I personally, use firefox as my base, and then I fix it to match the other browsers. There are some people who would do it the other way around.

CSS is a great tool; it has been around for some time, so use it wisely to better maintain the look and feel of your site. Effective use of CSS will result of easy maintenance of the site, easy changes of l&f, greater accessibility and fewer headaches for you.

Creative Thinking as a way to improve Software Development (and your business).

By Eduardo Chaccourt


For all of us working in software development industry, we are often seen as people with a very methodic, squared, always “inside the box” way of thinking. This is natural since most of us have had a very engineer-like formation in college. Subjects such as Binary math and circuit design, where everything has to be exact, this helped to achieve this way of thinking.

I’m not stating that this is necessarily wrong or “bad”, but not 100% precise. My thoughts are that software engineering is also a pretty creative profession. Imagine this scenario that was pretty recurring back in the day: You need to develop some software to control an onboard car computer, one of the restrictions was that you only had about 640 k (sometimes even less!) to create one of the most robust onboard car computer software to that day. So… what do you do? Do you follow the traditional way you develop where you might need a whole lot of memory? Of course not! That’s were creative thinking will be the key to correctly solve this requirement.

The companies that stand out from the rest are the ones that INNOVATED, that created something new, maybe something that users didn’t know they NEEDED until a company decided to bring it to them. UNIX, DOS, Windows, OS X, Netscape, Facebook, Twitter among others are products that users probably didn’t know they needed it until they started to use them.

If you want your company to stand out from the rest, let the developers innovate. Even if they are on a project with a well known set of problems that have a solution, developers can innovate by finding a new way to solve a problem!

Now, we don’t have to invent something from the ground up to be innovative. We can use existing tools in an innovative way. An analogy for this statement would be to build applications like if you were building something with “building blocks for kids”, you already have the blocks you need to build whatever you need, the only thing is to find out WHAT to build and if you don’t like it you can always toss it and build something new.

Unfortunately, some companies seem to want to deter innovation. When they see a developer thinking or staring at a blank code sheet, they tie them with terms like “low productivity”, but what if that developer, the one that you just told to get back to work immediately was actually assembling in his mind a new way to retrieve, set and update database records with half the time the traditional methods took? Maybe you, as a company, could’ve sold that particular library or method for thousands, maybe millions of dollars.

There are ways to promote innovation and creativity in organizations, here are a few tips:

· Let your developers “play”: If you keep Creative developers stuck for a long time with a very specific set of problems or tools, it won’t be long until they start showing signs of boredom or worse, apathy towards the project.

Sometimes people need new challenges to constantly to keep them on their toes. Also, let them experiment with new technology or programming languages, it’ll be a win-win situation, you will have workers with new and better skills and you will ease the creative developers need to play around and create.

· Learn to differentiate thinking from slacking: One of the problems of giving your developers freedom to think is that they might start to just do what’s necessary to get the job done or maybe do nothing while posing to be doing some intense thinking. One good way to see a difference between these two kinds of developers is that the creative developer will tend to get the job done at the time specified.

· Create Innovation games inside your company: Encourage your workers to innovate! One way to achieve this is to setup some kind of creativity contest for a new mash up page and its use, the main objective here is to let your creative developers explore new possibilities and help you expand your business as well. Of course you must remember that it must remain a win-win situation if you wish for everyone to participate.

My thoughts are that if you, as a head of the development area or an organization, want your developers to be more creative, you should encourage your workers to engage in creative activities (encourage, not force).

Follow my next blog post where I will analyze how artistic activities can help developers become more creative, and by this, more valuable assets to your company that they already are.

Recruitment process at Sieena

By Ilce L.

Commonly, recruitment process is done for administrative to technical positions; sometimes the recruiters do not have the knowledge to evaluate their technical abilities, however there are some ways to choose a correct candidate.

In Sieena particularity, this process is very dynamic and challenging for both parts, because somehow the candidate has to let us know that he/she is a good prospect for the vacancy, but we also have the challenge to let the candidate know that Sieena is has a good opportunity for him.

The process begins with the requisition sent by the managers about the new position. Human Capital is then in charge of posting our job openings, where we usually included the tools, technologies and knowledge needed, as well as their technical and administrative abilities that are required to clarify the profile that we are looking for.

The next step is to search databases for the people who have applied and with the correct profile. This is the first filter that we handle. This first filter is based in the comparison between the job description sent by the managers and the resume. This does not mean that the resumes of the other candidates are rejected; on the contrary, those resumes can be considerate for other open opportunities and are at the same time registered on our database.

Once we have chosen the correct information, we begin by asking one of our technical experts to review the candidate’s information; generally our vacancies require good level of English (most of our customers are from the USA) and with great GPA that endorse their skills and knowledge.

All our resumes are confidential and only used by the people in involved in the interview process.

The third step is to send by e-mail a couple of stand interview questions that help us to reassure the information on the resume, and we also ask for their economic expectations (we also usually call our candidates to let them know an email from us is awaiting on their inbox).

Once we have their answers and have found a coherent profile, we invite the candidate to a personal interview at our office. We also send them a personality test attached to an email so they can bring the results with them when we meet in person.

In the personal interview we don’t dig deep into technical topics, we usually like to talk about their plans, future, skills, life style, involving personal and professional questions in general, etc. where the recruiters can resolve if the person is a good candidate. This interview has not limit of questions or time, this does not indicate that the longer interview reflect that the candidate is best than others. Each person is a different case and all of them have a personal contact with Sieena’s administration.

Normally the technical interview is the next step after the personal general interview. This process is continuous, while we post the vacancies; we recollect resumes, make general and technical interviews and evaluate who is the most appropriate person for the vacancy. The general recruiting-hiring process ends in a period between 3 to 4 weeks after the vacancy is posted.

The decision is taken by the recruiter’s, technical experts and managers assigned to the specific position. When we already have the ideal candidate, we then try to close up with some administrative formalities and paperwork and then the candidate gets a call from our Human Capital department with the decision. If the offer is rejected, we take another candidate already interviewed as a second choice (who also fulfills the requirements) and if we do not have any more candidates, the recruitment process starts again.

If the letter offer is accepted, we contact the maintenance department to let them know a new partner is arriving soon so they can start with the physical allocation process. On their very first day at work, the consultant is given a tour of our office and goes through our induction process.

If you have any questions of doubts and would like to apply at Sieena, please feel free to contact us at jobs@sieena.com

What is SEO? - Marketing while you sleep




A long time ago, before Internet and Social Media, companies used Marketing tools that now seem a little obsolete.

Today not only people, but companies, take advantage of Social Media's benefits to market their products or services. Facebook, Twitter, Myspace, Linked in, Blogging, and Interactive websites are just a few examples of Social Media tools your company can use to get ahead in the brand race.

One of the most important things you have to do is try to make your site SEO friendly as much as you can.

SEO is a kind of marketing in which you can get new businesses and clients even when you’re asleep.
Let’s talk about something you can do to improve your Search Engine Optimization (SEO)
First you have to decide what you’re going to talk about and what is people looking for. Google has the tools to help you find the perfect keywords for your site like Adwords keyword tool and Search based keyword tool. Adwords keyword tool can show you the search volumes of past months; also if you’re interested in buying adwords it shows you the number of advertisers per keyword. Search based keyword tool analyzes your site and compares it with the words people is looking for in search engines.

Google Analytics is a great analysis tool; it helps you see what people think your site for free. All these tools can be very helpful to measure your Site’s traffic.

Here are some of the best practices to follow that’ll help you improve your SEO.

1. Tags of Page Title. Always use a representative titles
2. Tags in headers and subtitles. Use these powerful tags to apply significant keywords
3. Page content. Make sure to have keywords in your first paragraph, and also update your content frequently.
4. Highlight keywords. Try always to bold or highlight your important words.
5. Captions for images and pictures. Always use the Alt tag
6. Keywords. Use keywords in your files, pages and images. On your action links, avoid just saying “click here” try doing something more creative.
7. Navigation Breadcrumb. Breadcrumbs are not only useful for your site visitors to know where they are, but they help Search Engines navigate your site.
8. Description Metatag. Google uses the content of this tag on its search results. You can use your content to create a minimized site summary.
9. Keyword Metatag. You can pick ten of your keywords and put them in this metatag.
10. Sitemaps. You can use an html version to your site and create an xml version for Google. Also make sure to add a link to your html sitemap from your “Error 404” page, this will help lost visitors and search engines find their path.
11. Blogs. Google and other search engines like sites that frequently update their content, so always try to add new posts to your Blog, to keep it updated.
We have control of the situations and tools mentioned above, but what happens with the rest of the Internet? Search Engines give a lot of weight when your site’s link is included in other sites, to accomplish this you can comment on other people’s blogs and add your site link, you can also reference other sites, so they could do the same, and it’s very recommended that you choose pages with good reputation and good traffic.

All these tips together would help you get a better SEO. In posts to come I’ll tell you more secrets about how to use the Web for your company’s marketing success.

How to Optimize your Search Engine position using SharePoint.

It’s a fact that a great number of your site’s visitors come from Search Engines. This is why companies are investing good money on web marketing campaigns, and a very important part of this Marketing is having a great SEO (Search Engine Optimization). SEO is about certain rules that most of Search Engines follow, and it’s a little more technical than it looks like.

Here I present to you some advice to optimize your Search; they can be very easy to follow if you plan them since the beginning of your Public Site design, using SharePoint off course.

Semantic Code. It’s very important to use the correct HTML elements, for example, in headers, use

to

. Use the “list” element if you need to group information on a list: organized
    disorganized
      or defined lists
      .

      Take advantage of the benefits that the SharePoint image libraries can offer. For better SEO it’s important to use the ALT and TITLE attributes on the site’s images. This is something SharePoint provide you with on its "Picture Libraries".


      Keyword Density. You can check this solution on Mtelligent. Mtelligent allows you to add properties like Meta Keywords and Meta Description to SharePoint pages. It’s very important that all the words added to the “keywords” actually exist on your website. Bad use or property abuse are punished by Search engines, especially Google, so be careful!

          Descriptive text on links. Try to use a clear description on your links, use the TITLE and Tooltip attributes, SharePoint provides a very useful Web part to accomplish this ("Summary Link Web Part"). As shown on the image below, you only have to fill in the attribute fields and you are set.


      Friendly URLs. Make sure your site URL addresses describe themselves, avoid code or meaningless identifiers. There is a great solution on CodePlex, you install it on your site and it allows you to change your blog post’s URLs to make them more descriptive.

      There are many other features you can implement with SharePoint:
      • Use of a robots file.
      • Workflow to update your sitemap
      • Sites and Subsites in SharePoint. This is a great way to organize your site content, and search engines seem to like it.
      At last, I’ll like to mention some of the practices you have to AVOID when planning and building your web site in SharePoint:
      1. Avoid naming the site’s pages (page title) with the core functionality (ex.: Home-Home).Try using keywords.
      2. Avoid adding just one keyword repeatedly all over your site, if you do this search engines could discard your page for being “suspicious”
      3. Don’t use hidden fields with keywords visible to the search engine but not to the user.
      4. Use temporary redirects.
      5. Don’t use styles, nor “on line” javascript, it’s better to refer to them in a separate file.
      I hope you find this information very useful when creating your site.



5 Steps to Database Synchronization Part 1

This article is the first part of a series of three where we are going to demonstrate step by step how to synchronize a client database (SQL Server Express 2008) with a server database (SQL Server 2008) using Microsoft Synchronization Services through an N-Tier architecture supported by WCF.
Let’s suppose we have an application used by insurance agents to sell insurance policies on the field. The application can work offline and needs the ability to synchronize the data with the main server database. For the sake of simplicity, we will only be synchronizing one table (Policies).
The insurance agents should not be able to access all of the policies, only the policies sold by them, so we need to filter the data by the insurance agent id.

Step 1: Enable change tracking on our server and client databases.
One of the new features of the SQL Server 2008 version is the ability to track changes. Change information will be retained for at least the time period that is specified by the retention period and retention period units.
ALTER DATABASE Insurance SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE Insurance SET
CHANGE_TRACKING = ON (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)
Each table to be synchronized must have a primary key (the use of guids is recommended). Primary keys must be unique across all nodes and must not be reused. Run the following script for each table that we want to enable synchronization:
ALTER TABLE Insurance.dbo.Policies
ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = OFF)

Step 2: Create the Server Synchronization Provider
The Server Synchronization Provider stores information about the tables that are enabled for synchronization and enables the application to retrieve changes that occurred in the server database since the last synchronization. It is also responsible for applying changes to the server database and detecting any conflicts.
The sample code below demonstrates how to implement a Server Synchronization Provider. Note that the sample code uses two stored procedures, usp_GetNewBatchAnchor and usp_SelectIncrementalInserts. The code for those stored procedures is also provided.
Since we are implementing the synchronization direction as bidirectional, we need to set the following commands for each table we want to synchronize:
  • SelectIncrementalDeletesCommand: Gets the deletes made to the table in the server database since the last synchronization. These are the deletes that will be sent to the client database.
  • SelectIncrementalInsertsCommand: Gets the inserts made to the table in the server database since the last synchronization. These are the inserts that will be sent to the client database.
  • SelectIncrementalUpdatesCommand: Gets the updates made to the table in the server database since the last synchronization. These are the updates that will be sent to the client database.
  • InsertCommand: Used to insert a record that has been inserted in the client database.
  • UpdateCommand: Used to update a record that has been updated in the client database.
  • DeleteCommand: Used to delete a record that has been deleted in the client database.
  • SelectConflictUpdatedRowsCommand: selects conflicting rows from the server database if the rows still exist in the base table.
  • SelectConflictDeletedRowsCommand: Selects conflicting rows from the server database if the rows have been deleted from the base table.
The sample only shows how to set the SelectIncrementalInsertsCommand command. For a complete reference on how to define the commands, consult the Microsoft Synchronization Services documentation: http://msdn.microsoft.com/en-us/library/bb726002.aspx
On our next article 5 Steps to Database Synchronization Part 2 we will continue discussing the following steps. Stay tuned!
Sample Code: Creating the Server Synchronization Provider
//Create a class that is derived from Microsoft.Synchronization.Server.DbServerSyncProvider.
public class MyServerSynchronizationProvider : DbServerSyncProvider
{
public MyServerSynchronizationProvider()
{
//Create a connection to the server database
var serverConn =
new SqlConnection("Integrated Security=SSPI;database=Insurance;server=mySQLServer;Connect Timeout=30");
this.Connection = serverConn;
//Create a command to retrieve a new anchor value from the server. This value is retrieved and stored in the client database.
//During each synchronization, the new anchor value and the last anchor value from the previous synchronization
//are used. The set of changes between these upper and lower bounds is synchronized.
var selectNewAnchorCommand = new SqlCommand
{
CommandText = "usp_GetNewBatchAnchor",
CommandType = CommandType.StoredProcedure,
Connection = serverConn
};
selectNewAnchorCommand.Parameters.Add("@" + SyncSession.SyncLastReceivedAnchor, SqlDbType.BigInt, 8);
selectNewAnchorCommand.Parameters.Add("@" + SyncSession.SyncMaxReceivedAnchor, SqlDbType.BigInt, 8).Direction =
ParameterDirection.Output;
selectNewAnchorCommand.Parameters.Add("@" + SyncSession.SyncNewReceivedAnchor, SqlDbType.BigInt, 8).Direction =
ParameterDirection.Output;
selectNewAnchorCommand.Parameters.Add("@" + SyncSession.SyncBatchSize, SqlDbType.Int, 4);
selectNewAnchorCommand.Parameters.Add("@" + SyncSession.SyncBatchCount, SqlDbType.Int, 4).Direction =
ParameterDirection.InputOutput;
this.SelectNewAnchorCommand = selectNewAnchorCommand;
//Enable downloading changes by batches
this.BatchSize = 1000;
//Create a SyncAdapter for the each table to synchronize by using the SqlSyncAdapterBuilder.
var builder = new SqlSyncAdapterBuilder(serverConn)
{
TableName = "Policies",
ChangeTrackingType = ChangeTrackingType.SqlServerChangeTracking,
SyncDirection = SyncDirection.Bidirectional
};
//Specify a filter clause, which is an SQL WHERE clause without the WHERE keyword. Use the parameter that is
//created above. The value for the parameter is specified in the SyncAgent Configuration object.
//Create a filter parameter that will be used in the filter clause
var filterParameter = new SqlParameter("@InsuranceAgentId", SqlDbType.Int);
builder.FilterClause = " InsuranceAgentId=@InsuranceAgentId";
builder.FilterParameters.Add(filterParameter);
var syncAdapter = builder.ToSyncAdapter();
syncAdapter.TableName = "Policies";
//Specifying a Command to Select Incremental Inserts from the Server to Apply to the Client
var incrInserts = new SqlCommand
{
CommandText = "usp_SelectIncrementalInserts",
CommandType = CommandType.StoredProcedure
};
incrInserts.Parameters.Add("@" + SyncSession.SyncInitialized, SqlDbType.Int);
incrInserts.Parameters.Add("@" + SyncSession.SyncLastReceivedAnchor, SqlDbType.BigInt);
incrInserts.Parameters.Add("@" + SyncSession.SyncClientIdBinary, SqlDbType.Binary);
incrInserts.Parameters.Add("@" + SyncSession.SyncNewReceivedAnchor, SqlDbType.BigInt);
incrInserts.Parameters.Add("@" + SyncSession.SyncTableName, SqlDbType.NVarChar);
incrInserts.Connection = serverConn;
syncAdapter.SelectIncrementalInsertsCommand = incrInserts;
//Set the rest of the commands here!!!
this.SyncAdapters.Add(syncAdapter);
this.ApplyChangeFailed += ServerSyncProvider_ApplyChangeFailed;
}
void ServerSyncProvider_ApplyChangeFailed(object sender, ApplyChangeFailedEventArgs e)
{
//Respond to conflicts
}
}

CREATE PROCEDURE [dbo].[usp_GetNewBatchAnchor] (
@sync_last_received_anchor bigint,
@sync_batch_size int,
@sync_max_received_anchor bigint out,
@sync_new_received_anchor bigint out,
@sync_batch_count int output)
AS
-- Set a default batch size if a valid one is not passed in.
IF @sync_batch_size IS NULL OR @sync_batch_size <= 0
SET @sync_batch_size = 1000
-- Before selecting the first batch of changes,
-- set the maximum anchor value for this synchronization
-- session. After the first time that this procedure is
-- called, Synchronization Services passes a value for
-- @sync_max_received_anchor to the procedure. Batches of
-- changes are synchronized until this value is reached.
IF @sync_max_received_anchor IS NULL
SELECT @sync_max_received_anchor =
change_tracking_current_version()
-- If this is the first synchronization session for a database,
-- get the lowest change version value from the tables. By
-- default, Synchronization Services uses a value of 0 for
-- sync_last_received_anchor on the first synchronization. If
-- you do not set @sync_last_received_anchor,
-- this can cause empty batches to be downloaded until the
-- lowest change version value is reached.
IF @sync_last_received_anchor IS NULL OR
@sync_last_received_anchor = 0
BEGIN
SELECT @sync_last_received_anchor = 0
-- Changes are only retained in the change table for a limited
-- period of time set by the CHANGE_RETENTION parameter
-- (on ALTER DATABASE).
-- Check that we haven't had changes cleaned up on this table
-- (i.e. CHANGE_TRACKING_MIN_VALID_VERSION returns > 0)
IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(N'dbo.Policies')) > @sync_last_received_anchor
RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''. To recover from this error, the client must reinitialize its local database and try again',16,3,N'dbo.Policies')
SET @sync_new_received_anchor = @sync_last_received_anchor + @sync_batch_size
-- Determine how many batches are required during the
-- initial synchronization.
IF @sync_batch_count <= 0
SET @sync_batch_count = (
(@sync_max_received_anchor / @sync_batch_size) -
(@sync_last_received_anchor / @sync_batch_size)
)
END
ELSE
BEGIN
SET @sync_new_received_anchor = @sync_last_received_anchor + @sync_batch_size
-- Determine how many batches are required during subsequent
-- synchronizations.
IF @sync_batch_count <= 0
SET @sync_batch_count = (
(@sync_max_received_anchor / @sync_batch_size) -
(@sync_new_received_anchor / @sync_batch_size)) + 1
END
-- Check whether this is the last batch.
IF @sync_new_received_anchor >= @sync_max_received_anchor
BEGIN
SET @sync_new_received_anchor = @sync_max_received_anchor
IF @sync_batch_count <= 0
SET @sync_batch_count = 1
END
CREATE procedure [dbo].[usp_SelectIncrementalInserts]
(
@sync_initialized int,
@sync_last_received_anchor bigint,
@sync_client_id_binary binary,
@sync_new_received_anchor bigint,
@sync_table_name nvarchar,
@InsuranceAgentId int
)
AS
BEGIN
IF @sync_initialized = 0
SELECT dbo.Policies.[PolicyId], [PurchaseDate],[etc]
FROM dbo.Policies LEFT OUTER JOIN
CHANGETABLE(CHANGES dbo.Policies, @sync_last_received_anchor) CT
ON CT.[PolicyId] = dbo.Policies.[PolicyId]
WHERE InsuranceAgentId = @InsuranceAgentId AND
(CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT <> @sync_client_id_binary)
ELSE
BEGIN
SELECT dbo.Policies.[PolicyId], [PurchaseDate], [etc]
FROM dbo.Policies JOIN CHANGETABLE(CHANGES dbo.Policies, @sync_last_received_anchor) CT
ON CT.[PolicyId] = dbo.Policies.[PolicyId]
WHERE InsuranceAgentId = @InsuranceAgentId AND
(CT.SYS_CHANGE_OPERATION = 'I' AND CT.SYS_CHANGE_CREATION_VERSION
<= @sync_new_received_anchor
AND (CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT <> @sync_client_id_binary))
END
END


Monday, September 20, 2010

Sieena Renews Its Gold Certified Partner Status in Microsoft Partner Program

Sieena Renews Its Gold Certified Partner Status in Microsoft Partner Program

Renewed certification recognizes competencies in Software Development, Web Development, Portals and Collaboration, Business Intelligence and Data Management Solutions.

LOS ANGELES, Sept. 20 /PRNewswire/ -- Sieena, a leading Nearshore software development and IT outsourcing firm specializing in Microsoft technologies, today announced that Microsoft has renewed the company's status as a Microsoft Gold Certified Partner in recognition of its competencies in Web Development, Software Development, Portals and Collaboration, Business Intelligence and Data Management Solutions. Sieena has been a Microsoft Gold Certified Partner since 2007.

Sieena is also a Microsoft® SharePoint Deployment Planning Services provider and offers solutions for offshore development that are flexible with all delivered services. These planning services will help Sieena's clients across the U.S. plan an effective deployment of Microsoft SharePoint. Being a Microsoft certified partner, Sieena has the expertise that guides its clients through a highly effective planning process using best practices for getting more out of your SharePoint investment.

"We are pleased to have renewed our Gold Certified Partner status in the Microsoft Partner Program. This allows us to clearly demonstrate our expertise and relationship with Microsoft to our customers," said Mauricio Duran, Sieena President. "Microsoft Competencies help Sieena partners improve communications, lower costs and differentiate themselves with different technologies and provided solutions."

About Sieena

Sieena is a Nearshore software development firm specializing in Microsoft technologies. Headquartered in Los Angeles with a development center in Monterrey, Mexico, Sieena builds and maintains business-critical Web platforms and is a certified Microsoft Gold Partner. For more information visit www.sieena.com or for media inquiries contact Richie Matthews of DIALOGO at richie@dialogo.us.