April 16, 2012 Comments Off
We discovered a minor problem with our contact form this morning after recently upgrading to WordPress 3.3.1. Submits via our Contact Form no longer worked and threw an error. The plugin we use for sending emails via our contact form is called Contact Form 7. We thought perhaps an upgrade to the most recent version would solve the issue, but it did not.
Looking into the WP-Mail-SMTP plugin, which sets up email routing through our gmail domain account, it seemed that the port for smtp.gmail.com was not set correctly. The port setting for TLS/STARTTLS should have been 587 not 465. A quick change to the settings, and we can now confirm that the contact form is working correctly.
We’re not entirely sure how this setting may have changed on us, expect that maybe it was related to the upgrade.
Supported Links: http://angstrey.com/index.php/2009/04/22/how-to-send-e-mail-with-wordpress-from-godaddy-windows-hosting/
March 14, 2012 Comments Off
A short update that the Ruby on Rails crew at Black Ninja Software will be at Rails Conf this year in Austin! We do have an opening for a Ruby on Rails developer so feel free to send us an email or tweet your plans, we’d love to meet up.
Follow c0deNinja or matthewcarriere to get in touch.
Also check our our Ruby on Rails job posting to learn more about this job opening. We’re looking for any type of applicants, the focus for us will be technical ability and fit within the team.
See you all there!
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.
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:
-
Create a hyperlink that will be responsible for triggering your modal. Set the onclick attribute as follows:
<a href="#" onclick="javascript:openDialog(); return false;">Open Attach File</a>
-
Implement the openDialog function in javascript.
<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.
-
Create hidden fields to store the information you will need to modify the url.
<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" />
-
Setup the hidden fields in your Page_Load event.
listId.Value = list.ID.ToString();
itemId.Value = listItem.ID.ToString();
sourceUrl.Value = list.DefaultViewUrl;
webUrl.Value = web.Url;
-
Use the hidden fields in the javascript function you wrote above.
<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.
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;
} |
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:
-
Start > Run > C:\Windows\system32\secpol.msc
-
Go to Local Policies > Security Option
-
Change “Network security: LAN Manager authentication level” to “Send LM & NTLM – use NTLMv2 session security if negotiated”
-
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:
-
In IE, purposely sign out by clicking “Sign In as Different User”
-
Log in using the old domain (OldDomain\UserName)
-
After successfully signing in, “Sign In as Different User” again
-
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.
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!
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)
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.


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:

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:

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:

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:

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>

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:

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.
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 Rozzo – April 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 Klindt – June 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 Fox – May 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. Galvin – August 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 Hughes – September 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. Bleeker – June 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!