Inspiration
Earth Hour 2010, 27 march 8:30 pm
Feb 28th
Twitter And SharePoint Custom Timer Job with some Linq to XmL
Feb 5th
I’ve been fooling around with the Twitter API and how wanted to test how I could connect it to SharePoint. After som inspiration from Andrew Connell blog post about Custom Timer Jobs for SharePoint i’ve decided to give it a try. This function will update a list with tweets every 5 minutes so it wont go over the Rate Limit set for the Twitter API.
I’m using VS 2008 with VSeWSS 1.3 / WSS3.0
First I created a List called Twitter in the rootweb of my Wss3.0 installation and created the following columns:
Title Single line of text
Link Single line of text
Published Single line of text
Uri Single line of text
TweetAuthor Single line of text
TweetId Single line of text
TweetImage Single line of text
After this I started an VSeWSS SharePoint Empty Project named TaskLoggerJob and created a Class with the same name TaskLoggerJob: and a small class named Tweets to handle the Tweet properties:
Tweets.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace TaskLoggerJob
{
class Tweets
{
public string Id { get; set; }
public DateTime Published { get; set; }
public string Link { get; set; }
public string Image { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public string Uri { get; set; }
}
}
———————–
TaskLoggerJob.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint;
using System.Xml.Linq;
namespace TaskLoggerJob
{
class TaskLoggerJob : SPJobDefinition
{
List<Tweets> m_tweets;
/// <summary>
/// Initializes a new instance of the TaskLoggerJob class.
/// </summary>
public TaskLoggerJob()
: base()
{
}
/// <summary>
/// Initializes a new instance of the TaskLoggerJob class.
/// </summary>
/// <param name=”jobName”>Name of the job.</param>
/// <param name=”service”>The service.</param>
/// <param name=”server”>The server.</param>
/// <param name=”targetType”>Type of the target.</param>
public TaskLoggerJob(string jobName, SPService service, SPServer server, SPJobLockType targetType)
: base(jobName, service, server, targetType)
{
}
/// <summary>
/// Initializes a new instance of the TaskLoggerJob class.
/// </summary>
/// <param name=”jobName”>Name of the job.</param>
/// <param name=”webApplication”>The web application.</param>
public TaskLoggerJob(string jobName, SPWebApplication webApplication)
: base(jobName, webApplication, null, SPJobLockType.ContentDatabase)
{
this.Title = “Task Logger”;
}
/// <summary>
/// Executes the specified content db id.
/// </summary>
/// <param name=”contentDbId”>The content db id.</param>
public override void Execute(Guid contentDbId)
{
getTweets();
// get a reference to the current site collection’s content database
SPWebApplication webApplication = this.Parent as SPWebApplication;
SPContentDatabase contentDb = webApplication.ContentDatabases[contentDbId];
// get a reference to the “Tasks” list in the RootWeb of the first site collection in the content database
SPList taskList = contentDb.Sites[0].RootWeb.Lists["Twitter"];
SPListItemCollection items = taskList.Items;
// Clear Twitter List from objects
List<int> listaIds = new List<int>(items.Count);
for (int i = 0; i < items.Count; i++)
{
listaIds.Add(items[i].ID);
}
for (int i = 0; i < listaIds.Count; i++)
{
taskList.GetItemById(listaIds[i]).Delete();
}
taskList.Update();
foreach (Tweets item in m_tweets)
{
// create a new tweet, and update the item
SPListItem newTask = taskList.Items.Add();
newTask["Title"] = item.Title;
newTask.Update();
// Add data to new item..
SPListItem existingTask = taskList.GetItemById(newTask.ID);
existingTask["TweetAuthor"] = item.Author;
existingTask["Link"] = item.Uri;
existingTask["Published"] = item.Published.ToString();
existingTask["TweetId"] = item.Id;
existingTask["TweetImage"] = item.Image;
existingTask.Update();
}
taskList.Update();
}
public void getTweets()
{
XDocument feed = XDocument.Load(“http://search.twitter.com/search.atom?q=from:chrperss“);
XNamespace atomNS = “http://www.w3.org/2005/Atom“;
m_tweets = (from tweet in feed.Descendants(atomNS + “entry”)
select new Tweets
{
Title = (string)tweet.Element(atomNS + “title”),
Published = DateTime.Parse((string)tweet.Element(atomNS + “published”)),
Id = (string)tweet.Element(atomNS + “id”),
Link = tweet.Elements(atomNS + “link”)
.Where(link => (string)link.Attribute(“rel”) == “alternate”)
.Select(link => (string)link.Attribute(“href”))
.First(),
Image = tweet.Elements(atomNS + “link”)
.Where(link => (string)link.Attribute(“rel”) == “image”)
.Select(link => (string)link.Attribute(“href”))
.First(),
Author = (string)tweet.Element(atomNS + “author”).Element(atomNS + “name”),
Uri = (string)tweet.Element(atomNS + “author”).Element(atomNS + “uri”),
}).ToList<Tweets>();
}
}
}
————————————-
After this I created a FeatureReceiverClass to get it all going: Named it TaskLoggerJobInstaller
TaskLoggerJobInstaller.cs
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
namespace TaskLoggerJob
{
class TaskLoggerJobInstaller : SPFeatureReceiver
{
const string TASK_LOGGER_JOB_NAME = “TaskLogger”;
///
/// Occurs after a Feature is installed.
///
///
An object that represents the properties of the event. public override void FeatureInstalled(SPFeatureReceiverProperties properties)
{
}
///
/// Occurs when a Feature is uninstalled.
///
///
An object that represents the properties of the event. public override void FeatureUninstalling(SPFeatureReceiverProperties properties)
{
}
///
/// Occurs after a Feature is activated.
///
///
An object that represents the properties of the event. public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
// register the the current web
SPSite site = properties.Feature.Parent as SPSite;
// make sure the job isn’t already registered
foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
{
if (job.Name == TASK_LOGGER_JOB_NAME)
job.Delete();
}
// install the job
TaskLoggerJob taskLoggerJob = new TaskLoggerJob(TASK_LOGGER_JOB_NAME, site.WebApplication);
SPMinuteSchedule schedule = new SPMinuteSchedule();
schedule.BeginSecond = 0;
schedule.EndSecond = 59;
schedule.Interval = 5;
taskLoggerJob.Schedule = schedule;
taskLoggerJob.Update();
}
///
/// Occurs when a Feature is deactivated.
///
///
An object that represents the properties of the event. public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
SPSite site = properties.Feature.Parent as SPSite;
// delete the job
foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
{
if (job.Name == TASK_LOGGER_JOB_NAME)
job.Delete();
}
}
}
}
————————-
Then I’ve had to modify the Feature.xml file that is created when we add a new feature to the project through the “WSP View”, so it points to the ReceiverClass we just created and ReceiverAssembly
<?xml version=”1.0″ encoding=”utf-8″?>
<Feature Id=”3901dc1f-5b79-4e70-96af-f4ed32d3da0e” Title=”TaskLoggerJob” Scope=”Site” Version=”1.0.0.0″ Hidden=”FALSE” DefaultResourceFile=”core” xmlns=”http://schemas.microsoft.com/sharepoint/” ReceiverAssembly=”TaskLoggerJob, Version=1.0.0.0, Culture=neutral, PublicKeyToken=53b5e25b60ede585″ ReceiverClass=”TaskLoggerJob.TaskLoggerJobInstaller”>
<ElementManifests />
</Feature>
The Custom Timer Job is complete and should be able to deploy, now after 5 minutes the Twitter List should be filled with 15 blogposts.
note: Remember that you might have to restart the SharePoint Timer Service when you make changes since it keeps a chached version of you assemblis. Also remember to change the guids and Publickeytoken if you copy this.
And if it doesnt work? don’t blame me cause Im a noob
![]()
Abduzeedo.com: Daily Inspiration #165
Apr 9th
This post is part of our daily series of posts showing the most inspiring images selected by some of the Abduzeedo’s writers and users.
YOUR LIGHT SWITCH IS YOUR VOTE
Mar 27th
This year, Earth Hour has been transformed into the world’s first global election, between Earth and global warming.
For the first time in history, people of all ages, nationalities, race and background have the opportunity to use their light switch as their vote – Switching off your lights is a vote for Earth, or leaving them on is a vote for global warming. WWF are urging the world to VOTE EARTH and reach the target of 1 billion votes, which will be presented to world leaders at the Global Climate Change Conference in Copenhagen 2009.
This meeting will determine official government policies to take action against global warming, which will replace the Kyoto Protocol. It is the chance for the people of the world to make their voice heard.
Earth Hour began in Sydney in 2007, when 2.2 million homes and businesses switched off their lights for one hour. In 2008 the message had grown into a global sustainability movement, with 50 million people switching off their lights. Global landmarks such as the Golden Gate Bridge in San Francisco, Rome’s Colosseum, the Sydney Opera House and the Coca Cola billboard in Times Square all stood in darkness.
In 2009, Earth Hour is being taken to the next level, with the goal of 1 billion people switching off their lights as part of a global vote. Unlike any election in history, it is not about what country you’re from, but instead, what planet you’re from. VOTE EARTH is a global call to action for every individual, every business, and every community. A call to stand up and take control over the future of our planet. Over 74 countries and territories have pledged their support to VOTE EARTH during Earth Hour 2009, and this number is growing everyday.
We all have a vote, and every single vote counts. Together we can take control of the future of our planet, for future generations.
VOTE EARTH by simply switching off your lights for one hour, and join the world for Earth Hour.
Saturday, March 28, 8:30-9:30pm.
Try out fonts online…
Mar 20th
Use this site to compare and see how a font will look like online.
What is Typetester?
The Typetester is an online application for comparison of the fonts for the screen. Its primary role is to make web designer’s life easier. As the new fonts are bundled into operating systems, the list of the common fonts will be updated. // http://www.typetester.org/
Articles by Topic: Inspiration :D
Mar 20th

http://www.smashingmagazine.com/category/monday-inspiration/
Great place for ideas and inspiration. Graphics, Web, CSS, Fonts…
A great place to get inspired!
Mar 20th
Check out this great blog for inspiration for your ongoing design work..


Recent Comments