Archive for 'Blog'


Tribute to Steve Jobs

October 6, 2011 1 comment

From all of us here at Black Ninja Software, we want to thank you Steve.

Thank you for making products that are not only delightful to use, but that solve problems we didn’t even know we had.

Thank you for seeing the future as you felt it should be and for having the fortitute, perserverence and discipline to make it happen.

And finally, thank you for inspiring all of us to get up each morning and ask ourselves: “if today were the last day of my life, would i want to do what i am about to do today?”.

You’ve had a profound impact on our lives, and for that we will be eternally grateful.

In tribute:

Robert Scoble: http://www.businessinsider.com/my-apology-to-tim-cook-and-remembering-steve-jobs-2011-10

FreshBooks: http://www.freshbooks.com/blog/2011/10/06/a-good-sign-of-vision-is-that-no-one-else-can-see-it/

“My job is not to be easy on people. My jobs is to take these great people we have and to push them and make them even better.” – All About Steve Jobs

“You can’t just ask customers what they want and then try to give that to them. By the time you get it built, they’ll want something new.” – Inc. Magazine

“Stay hungry, stay foolish.” – Steve Jobs

Rest in peace Steve, we will surely miss you.



How to Use Modal Dialog in Sharepoint 2010

January 21, 2011 Comments Off

Modal dialogs are really fun to work with but can be frustrating to implement if you don’t know what’s required to work with them. If you have a Java background you will be amazed with how SharePoint deals with modal dialogs. The concept is almost the same but you need a slightly different approach to implement it.

Modal dialogs in SharePoint 2010 use the client library SP.UI.ModalDialog and showModalDialog. We can do the following within the context of a page without leaving the page:

  • Add and Edit metadata
  • Perform administrative task
  • Attach documents/files

The following step-by-step instructions show you how to implement a modal dialog in your server side pages:

  1. Create a hyperlink that will be responsible for triggering your modal. Set the onclick attribute as follows:
  2. <a href="#" onclick="javascript:openDialog(); return false;">Open Attach File</a>
  3. Implement the openDialog function in javascript.
  4. <script type="text/javascript">
        function openDialog() 
        {
            var options = 
            {
    	    url: http://server/_layouts/AttachFile.aspx?ListId={0F42F104-538C-4F3C-8098-0DD93C8CD779}&ItemId=246&Source=http%3A%2F%2Fdeadmines%2Fsites%2Fhorizon%2FLists%2FYear%2520End%2FMy%2520Inbox%2520%2520All%2520lists.aspx,
    	    width: 800,
    	    height: 600,
    	    title: "Attach File",
            };
    	SP.UI.ModalDialog.showModalDialog(options);
        }
    </script>

    To be more dynamic…

    Hard coding the url is not recommended because it is really hard to maintain. There are lots of ways to make your code dynamic and this is only one of them. We could have also leveraged the url query strings that contain most of this information.

  5. Create hidden fields to store the information you will need to modify the url.
  6.     <input type="hidden" id="listId" runat="server" />
        <input type="hidden" id="itemId" runat="server" />
        <input type="hidden" id="sourceUrl" runat="server" />
        <input type="hidden" id="webUrl" runat="server" />
  7. Setup the hidden fields in your Page_Load event.
  8.         listId.Value = list.ID.ToString();
            itemId.Value = listItem.ID.ToString();
            sourceUrl.Value = list.DefaultViewUrl;
            webUrl.Value = web.Url;
  9. Use the hidden fields in the javascript function you wrote above.
  10. <script type="text/javascript">
        function openDialog() 
        {
            var options = 
            {
    	    url:  $("#<%= webUrl.ClientID %>").val()+ "/_layouts/AttachFile.aspx?ListId=" + $("#<%= listId.ClientID 
                         %>").val() + "&ItemId=" + $("#<%= itemId.ClientID %>").val() + "&Source=" + $("#<%= 
                         sourceUrl.ClientID %>").val(),
    	    width: 800,
    	    height: 600,
    	    title: "Attach File",
            };
    	SP.UI.ModalDialog.showModalDialog(options);
         }
    </script>

I will end my blog by quoting one of my favorite programming quotes by C.A.R. Hoare:

There are two ways of coding. On way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies.



How to Identify if SharePoint “Person or Group” Field Entry is User or Group

January 13, 2011 Comments Off

In a lot of our custom forms, we use EnsureUser to verify if a user is exists in the SharePoint site or not and if not, EnsureUser takes care of setting them up for us. According to MS:

Checks whether the specified login name belongs to a valid user of the website, and if the login name does not already exist, adds it to the website.

When working with Person or Group columns, often times we use EnsureUser, however, if the Person or Group column you’re reading from could potentially contain a group, the EnsureUser call will fail. So we need a way to determine if what’s stored in a Person or Group column is a User or a Group entity.

This is what we came up with, it works well for us:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//SPPrincipalInfo provides access to information about the current principal.  
SPPrincipalInfo principalInfo = SPUtility.ResolveWindowsPrincipal(site.WebApplication, lookup.LookupValue, SPPrincipalType.All, false);
 
//if this is null, then we assume it's a SharePoint group
if (principalInfo != null)
{
     //Checks whether the specified login name belongs to a valid user.
     SPUser user = web.EnsureUser(lookup.LookupValue);
     ddlPoss.Items.FindByValue(user.ID.ToString()).Selected = true;
}
else
{
     SPGroup group = web.Groups[lookup.LookupValue];
     ddlPoss.Items.FindByValue(group.ID.ToString()).Selected = true;
}


Resolution: Windows 7 User Cannot Connect to SharePoint (WSS v3.0) Site

January 12, 2011 Comments Off

One of our users had recently:

  • been migrated from one domain (OldDomain) to another domain (NewDomain)
  • upgraded from Windows XP to Windows 7

Our grief started when he could not log into our SharePoint site anymore. When he tried to log in, he would either:

  • get prompted to authenticate, then get an error page saying “Connection was reset”, or
  • not get prompted at all, but get a “Connection was reset” error

We further verified this error by running both FireBug and Fiddler.

Initially we were thinking it must be the domain change; technically that’s the biggest change. We were also not able to ping the SharePoint site URL, but oddly we could ping the IP address of the site. This led us to think that this could be DNS related.

We went on a wild goose chase as to what domain-related problem it could have been, including:

  • flushing dns (flushdns)
  • refreshing DNS suffix search list
  • checking that user’s domain privileges, group policies
  • etc

We also did try other general non-domain-related possible fixes, like:

  • turning off firewall
  • adding site to Intranet Zone
  • adding site to Trusted Sites
  • allowing JavaScript, cookies in site
  • etc

Unfortunately we did not get any resolution, and we were not making any progress with this issue.

We also knew it was not a credentials issue as the user could still connect to our SharePoint site using another laptop running Windows XP. So, it’s not the domain name change after all. The culprit then had to be Windows 7.

Thank goodness we came across this post: http://social.msdn.microsoft.com/Forums/en/sharepoint2010general/thread/bc216eb7-d556-4819-8d96-8e14ee988f24 (Thank you MichAda!)

The resolution is to change Network security: LAN Manager authentication level in Windows 7′s Local Security Policy to Send LM & NTLM – use NTLMv2 session security if negotiated:

  1. Start > Run > C:\Windows\system32\secpol.msc
  2. Go to Local Policies > Security Option
  3. Change “Network security: LAN Manager authentication level” to “Send LM & NTLM – use NTLMv2 session security if negotiated”
  4. Apply the changes, and test again

We thought this was it! We tested on Firefox, and everything was back to normal in FIREFOX. Unfortunately, not everything was in happy land with IE. No matter what we did, we could not authenticate the user in IE. After a bit more fiddling around, this is what we found as a fix:

  1. In IE, purposely sign out by clicking “Sign In as Different User”
  2. Log in using the old domain (OldDomain\UserName)
  3. After successfully signing in, “Sign In as Different User” again
  4. Log in using the new domain (NewDomain\UserName)

Not sure why that works. Maybe somehow the old credentials are still what IE remembers. At this point, we’re just happy the user can sign in again and work with SharePoint.



SharePoint Training Classes Posted for the New Year

January 5, 2011 Comments Off

Happy new year! I hope the holiday break was a good one. Everyone here at Black Ninja was able to take some time off to spend with family and we thoroughly enjoyed it. After all that rest and relaxation, we are ready to roll for the new year.

We’ve started by posting a new set of training dates for our SharePoint and SQL Server courses. In particular, we’re offering SharePoint Designer 2007 and SharePoint 2007 Operations training again this January. Both of these classes just met with huge success this past December. The material is custom written by us and packed with industry experience making it a huge hit among students.

Our training classes are held in our very comfortable North Vancouver offices, we provide coffees/teas and plenty of snacks. Most of our trainers are Microsoft Certified, and those who aren’t we consider to be SharePoint Superstars. We are passionate technology professionals who love to teach and educate on the areas we’ve focused our expertise on.

If you’re interested in attending a class with us, don’t hesitate to give us a call or email your inquiries. We look forward to seeing you in one of our classes!



Programmatically and Selectively Revoke SharePoint Item-Level Permissions Using PowerShell

June 20, 2010 1 comment

I’ve been using PowerShell more and more lately, and liking it more and more as I use it.

Here’s another one you might find useful – programmatically and selectively revoking item-level permissions. For this scenario, the SharePoint list already has inheritance broken. Now we have to loop through the versions of SharePoint list items, and check a people/group column called Participant. A participant would have had read/contribute permissions before, but after the list item has been verified, we don’t want the participants changing any of the values anymore.

We will start with the typical loading of the DLL, and creating a handle to our SharePoint site:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#Load the SharePoint DLL
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") | Out-Null
$SiteURL = $server;
 
#make sure we're using the system account token
$TmpSite = New-Object Microsoft.SharePoint.SPSite($SiteURL);
$SysToken = $TmpSite.SystemAccount.UserToken;
 
$SPSite = New-Object Microsoft.SharePoint.SPSite($SiteURL,$SysToken);
 
#if we want to get additional info about SPSite, code is below
#$SPSite.AllWebs | Format-Table Url, ID, Name, AllUsers
 
$SPWeb = $SPSite.OpenWeb();
$SPWeb.AllowUnsafeUpdates = $true;
 
$MyList = $SPWeb.Lists["My Sample List"];

Now let’s get only verified items from our list:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
#note your ending herestring must NOT have a space before it.
#also, this "Project Audited" field is really a boolean, 
#but using the Integer works
$CAML = @"
<Where>
     <Eq>
        <FieldRef Name='Project_x0020_Verified' />
        <Value Type='Integer'>1</Value>
     </Eq>
  </Where>
"@
 
$SPQuery = New-Object Microsoft.SharePoint.SPQuery;
$SPQuery.Query = $CAML;
 
$itemCollection = $null;
$itemCollection = $MyList.GetItems($SPQuery);
$listItem = $null;

Now the bulk of the work is as follows:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
if($ItemCollection.Count -gt 0)
{
   foreach($listItem in $itemCollection)
   {
 
        $ID = [string]$listItem["ID"]
        $ProjectVerified = [string]$listItem["Project Verified"]
 
        #now I want to display the roles before I revoke, 
        #so I can verify the changes visually
        #assume in here you already created a new file for 
        #this process, and gave it a handle $logfile
        "Roles BEFORE revoke : "  | Out-File -FilePath $logfile -Append
        foreach ($role in $roles)
        {
            $msg =  "Role : ID " + $role.Member.ID.ToString() + " : Name  " +  $role.Member.Name
            $msg | Out-File -FilePath $logfile -Append
        }
 
        #get the item versions (SPListItemVersionCollection)
        $itemVersionCollection = $listItem.Versions;
 
        #need to check current permissions
        #we'll store all Participants in an array first and evaluate later
        $Participants = @();
 
        foreach($currentVersion in $itemVersionCollection)
        {
            $SPFieldUserValue = New-Object Microsoft.SharePoint.SPFieldUserValue($SPWeb, [string]$currentVersion["Participant"]);
            $Participants += $SPFieldUserValue.User.LoginName
        }
 
        #now, we just want to get the unique people from the version, 
        #so we don't unnecessarily revoke
        $Participants = $Participants | SELECT -Unique
 
        #let's now revoke permissions for every participant
        #that has ever been involved in any version of this item
        foreach($Participant in $Participants)
        {
            $user = $SPWeb.AllUsers[$Participant];
            $listItem.RoleAssignments.Remove([Microsoft.SharePoint.SPUser]$user);
        }
 
        #confirm
        "Roles AFTER revoke : "  | Out-File -FilePath $logfile -Append
        foreach ($role in $roles)
        {
            $msg =  "Role : ID " + $role.Member.ID.ToString() + " : Name  " +  $role.Member.Name
            $msg | Out-File -FilePath $logfile -Append
        }
 
    } 
}

And very very important, do not forget to dispose the SPWeb and SPSite objects you created. It’s VERY bad to not dispose it, as it will definitely slow down your site, one way or another. Believe me, you don’t want to learn this the hard way.

1
2
3
$SPWeb.Dispose();
$SPSite.Dispose();
$TmpSite.Dispose();

Done. Happy times.

- Donabel (@sqlbelle)



Leverage 960.gs for Page Layout

April 18, 2010 Comments Off

The 960 grid system is a great tool for streamlining your web development effort by providing a convention around the most commonly used dimensions, based on a width of 960 pixels. You can learn more about this system at 960.gs, or you can experiment with the HTML LAYOUT Generator.

What I wanted to address in this article was some basic CSS/HTML techniques that integrate the core concepts of the 960 grid system to easily allow you to achieve beautifully laid out web pages.

Here at Black Ninja, we do a fair bit of site design and so we wanted to build a consistent framework that we use across all our sites. It had to be flexible, easy to understand and powerful for customization.

Let’s get into some specific examples so that we can see the types of options and flexibility we have when trying to layout our pages and the content within them.

To setup our scenario, what we really wanted with this layout was a centered fixed width design, that when resized, had the effect of expanding the area around our content, but did not alter the content itself. We wanted to avoid fluidity that was hard to predict. We also don’t feel that pages need to necessarily scale for every resolution. A 27” monitor has a lot of real estate for web page viewing, but do users actually use the full screen width when viewing their pages?

For example, compare sites like chapters.indigo.ca and amazon.ca. Both have the same function, but their layout is entirely different. Amazon has content areas within the center that expand and shrink as you resize your browser window. The Chapters website content is centered and does not alter in anyway. The only thing that changes is the white space around the main content. The Chapters effect is what I’m going to demonstrate here.

Screen shot 2010-04-18 at 10.36.44 AM

Screen shot 2010-04-17 at 9.28.54 AM

Let’s start by creating a new page, we’ll call it index.html and we’ll insert a header, main content area and a footer:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>960.gs Demo</title>
</head>
<body>
 
<div id="header">
	this is my header
</div>
 
<div id="main">
  this is my main content area
</div>
 
<div id="footer">
  this is my footer
</div>
 
</body>
</html>

If we save the page and open it in a browser, we should see:

Screen shot 2010-04-18 at 10.50.02 AM

Starting with the header, we’re going to want to center this, and have control over the style of both the centered content and the wrapper content. In order to achieve this, I’m going to add a div inside the header div, and i’m going to apply some styles to both:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>960.gs Demo</title>
<style>
body {
	margin: 0;
	text-align: left;
	padding: 0;
	font: normal 14px/16px "Helvetica Neue", Helvetica, Arial, sans-serif;
	background: #FFF;
	color: #333;
}
 
#header {
	background-color:#FFF;
}
 
#header-inner {
	margin: 0 auto;
	width: 940px;
	height: 30px;
	padding: 10px 20px;
	background-color:#333;
	color:#FFF;
}
</style>
</head>
<body>
 
<div id="header">
	<div id="header-inner">
	    this is my header content
	</div>
</div>
 
<div id="main">
  this is my main content area
</div>
 
<div id="footer">
  this is my footer
</div>
 
</body>
</html>

So the two key pieces to the above code is the #header and #header-inner styles. The margin:0 auto gives us the effect of centering our div. We set our width of 940px, the height we want to size our header to, and some extra padding so everything isn’t packed so close together. The background colors for both #header and #header-inner are entirely up to you. If you’d like the two to blend, set the colors to be the same. If you want a contrast effect, make them different. And here is the effect:

Second Draft

Let’s make a minor change to the #header class and set the background color to be the same as our #header-inner:

#header {
	background-color:#333;
}

Save and reload:

Third Draft

So now as the window is resized, the content within the center remains at 940px and won’t change at all.

Let’s apply this same concept to the content area of our site. First, let’s throw some dummy content in there:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>960.gs Demo</title>
<style>
body {
	margin: 0;
	text-align: left;
	padding: 0;
	font: normal 14px/16px "Helvetica Neue", Helvetica, Arial, sans-serif;
	background: #FFF;
	color: #333;
}
#header {
	background-color:#333;
}
 
#header-inner {
	margin: 0 auto;
	width: 940px;
	height: 30px;
	padding: 10px 20px;
	background-color:#333;
	color:#FFF;
}
</style>
</head>
<body>
 
<div id="header">
	<div id="header-inner">
	    this is my header content
	</div>
</div>
 
<div id="main">
  <div id="main-inner">
		<p class="lead">Let's talk about our site a little bit.</p>
		<div class="leftcol">
			<h3>More data</h3>
			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>					
		</div>
		<div class="rightcol">
			<h3>Some data</h3>
			<p><a href="http://tenderapp.com">Duis aute irure dolor</a> in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
		</div>
</div>
 
<div id="footer">
  this is my footer
</div>
 
</body>
</html>

We should see:

Fourth Draft

Once the dummy content is in there, we can properly style our main content divs. The left and right col divs both get a width of 470px, had we wanted to make this content area 3 divs instead of two, we could have set them to 300px each.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>960.gs Demo</title>
<style>
body {
	margin: 0;
	text-align: left;
	padding: 0;
	font: normal 14px/16px "Helvetica Neue", Helvetica, Arial, sans-serif;
	background: #FFF;
	color: #333;
}
#header {
	background-color:#333;
}
 
#header-inner {
	margin: 0 auto;
	width: 940px;
	height: 30px;
	padding: 10px 20px;
	background-color:#333;
	color:#FFF;
}
 
#headline {
	background: #FFF;
}
 
#main {
	background-color: #FFF;
}
 
#main-inner {
	margin: 0 auto;
	width: 940px;
	height: 450px;
	background-color: #FFF;
}
 
div.leftcol {
	width: 470px;
	float: left;
}
 
div.rightcol {
	width: 470px;
	float: right;
}
 
</style>
</head>
<body>
 
<div id="header">
	<div id="header-inner">
	    this is my header content
	</div>
</div>
 
<div id="main">
  <div id="main-inner">
		<p class="lead">Let's talk about our site a little bit.</p>
		<div class="leftcol">
			<h3>More data</h3>
			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>					
		</div>
		<div class="rightcol">
			<h3>Some data</h3>
			<p><a href="http://tenderapp.com">Duis aute irure dolor</a> in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
		</div>
	</div>
</div>
 
<div id="footer">
  	this is my footer
</div>
 
</body>
</html>

Fifth Draft

And finally, our footer, we need to style it properly so it takes it’s correct position on the page:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>960.gs Demo</title>
<style>
body {
	margin: 0;
	text-align: left;
	padding: 0;
	font: normal 14px/16px "Helvetica Neue", Helvetica, Arial, sans-serif;
	background: #FFF;
	color: #333;
}
#header {
	background-color: #333;
}
 
#header-inner {
	margin: 0 auto;
	width: 940px;
	height: 30px;
	padding: 10px 20px;
	background-color: #333;
	color:#FFF;
}
 
#headline {
	background: #FFF;
}
 
#main {
	background-color: #FFF;
}
 
#main-inner {
	margin: 0 auto;
	width: 940px;
	height: 450px;
	background-color: #FFF;
}
 
div.leftcol {
	width: 470px;
	float: left;
}
 
div.rightcol {
	width: 470px;
	float: right;
}
 
#footer {
  	border-top: 1px solid #dbdbdb;
}
 
#footer-inner {
	font-size: 12px;
	margin: 0 auto;
	width: 940px;
	height: 100px;
}
 
</style>
</head>
<body>
 
<div id="header">
	<div id="header-inner">
	    this is my header content
	</div>
</div>
 
<div id="main">
  <div id="main-inner">
		<p class="lead">Let's talk about our site a little bit.</p>
		<div class="leftcol">
			<h3>More data</h3>
			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>					
		</div>
		<div class="rightcol">
			<h3>Some data</h3>
			<p><a href="http://tenderapp.com">Duis aute irure dolor</a> in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
		</div>
	</div>
</div>
 
<div id="footer">
  	<div id="footer-inner">
		this is my footer
	</div>
</div>
 
</body>
</html>

And our final result is:
Final Draft

And that’s it. I hope that clearly demonstrates how easy it is to layout your pages. Please post a comment if you have any modifications to suggest or questions about the above code.



SharePoint 2010 Books – Which Ones to Buy?

April 7, 2010 Comments Off

As many of you are already aware, SharePoint 2010 is on it’s way to becoming an official release, May 12, to be exact. There are a slew of books that are in the works and we found ourselves wondering which ones we should pre-order for our already overflowing bookshelves.

We order books on an almost weekly basis here at Black Ninja so it’s about that time where we need to prepare for the 2010 releases. Here is a list of the ones we found to be most interesting and that we’ve already pre-ordered:

  • “Professional SharePoint 2010 Development” – Tom RozzoApril 23 Release
    • We do a lot of custom SharePoint development here at Black Ninja, so this book was a must have. We’ve attended plenty of Tom’s sessions at various conferences in the past, and he definitely knows his stuff. The fact that’s it set to release pretty soon was also a factor; we’d like to get our hands on a 2010 development book as soon as possible.
  • “Professional SharePoint 2010 Administration” – Todd KlindtJune 17 Release
    • This book is equally important as the development book in our eyes because administration is such a crucial component for any successful SharePoint deployment. We’re a fan of Todd’s work and already own Real World SharePoint 2007 on which he was a contributing author.
  • “Beginning SharePoint 2010 Development” – Steve FoxMay 20 Release
    • This was another close release date and having an extra development book around the office wasn’t going to hurt anything. We’ve also used Steve Fox’s articles on more than one occasion, and look forward to reading this book.
  • “Professional Workflow 4 in Sharepoint 2010: Real World Business Workflow Solutions” – Paul J. GalvinAugust 3 Release
    • Workflows are another huge part of what we do here at Black Ninja. Our aim was to get at least 1 development book, 1 SharePoint Designer book and 1 Workflow book. This was our pick for workflow book.
  • “SharePoint Designer 2010 Unleashed” – Kathy HughesSeptember 27 Release
    • We spend a fair bit of time tinkering with SharePoint Designer as well. We’ve even taught 5-day classes that cover this product from beginning to end. We are very eager to sit down and play around with some of the real world examples this book promises to cover.
  • “SharePoint Developer’s Guide: SharePoint Foundation 2010″ – Todd C. BleekerJune 1 Release
    • Todd C. Bleeker wrote this book, enough said.

As you can see, we tried to go with books of authors we knew and were fairly active in the community. We’ve also tried to balance the administration/designer/development roles because we often have to put on all three hats. If anyone else has any books suggestions to go along with this, please contribute to the comments below!



We’ve Added an Aztec Warrior to Our Team!

March 23, 2010 Comments Off

We’re very excited to welcome Miguel A. Tena as the newest member of the Black Ninja team! As you’ll read more about in his bio, Miguel is a huge fan of SharePoint and ASP.NET development and is already gearing up to become super active in the SharePoint and .NET communities. He’s been working with SharePoint since it’s early days and we’ve already begun leveraging his knowledge, enthusiasm and passion for further development of our training services. Stay tuned for more updates from Miguel in the next couple of weeks.

So, please join us in welcoming Miguel, the Aztec Warrior, to our team!



SQL Ninja to Present Idera Webcast in March!

February 28, 2010 Comments Off

Our very own @sqlbelle will be presenting her very first Idera webcast this month and it’s going to be a good one!

SQL Developer’s Guide to Solving Database Administration Headaches

Many SQL Server developers are finding themselves having to deal with an increasing number of administrative tasks traditionally assigned to DBAs. In this session of Secrets of SQL Server, SQL Server developers will learn how to recognize and address common administrative issues to ensure successful implementation of their development projects.

Tune into this live webcast to learn SQL Server secrets from the pros.

Register now!

Date: Wednesday, March 10, 2010
Time: 3:00 p.m. – 4:00 p.m. CST
Hosted by: Idera | MSSQLTips
Speaker: Donabel Santos, DBA/Developer/Trainer at Black Ninja Software and Instructor at the British Columbia Institute of Technology




Upcoming Training Events


We also have courses on Ruby on Rails and SharePoint 2007 Application Development!

Check our training page for schedule, content and rates!

We are experts

Black Ninja Software was created with the idea that great software comes from great people. We are passionate about the technologies we use and continually refine our skills to better master what we do. This is what makes us Ninjas. We architect, design, and implement solutions using Microsoft Office SharePoint Server, SQL Server, and ASP.NET

We create software

If you have a business process that needs refining or automation, or you have a current project in distress that needs rescuing, we can help. Our wealth of experience will create your great idea from scratch if that's what you need ninjas to do for you. In addition to the work we do for our clients, we also have several of our own projects that are currently being developed. We use the same tools and the same skills on our projects as we do on yours.