Archive for May, 2015

Product analysis by Vlad Catrinescu – requested by CloudShare, but thoughts are my own.

There are two things that almost everybody working with SharePoint agrees on; first one is that SharePoint is a development platform. Every company has different problems to solve, and with a little (or a lot) of custom Development, SharePoint can do it. Second is that SharePoint takes a lot of resources! A SharePoint 2013 development VM needs at least 12 GB of Ram, that’s if you don’t use Search or the User Profile! If you use those, you’re looking at about 24GB of ram and 4-8 cores easily. Furthermore, getting the required virtual machines when a new developer joins the project, or when a new project starts can sometimes take quite some time as the company’s SharePoint admin has to install and configure them properly. Another problem is that companies often cannot host all the virtual machines for SharePoint developers, and therefore, developers have to code on underperforming virtual machines and cannot fully reproduce a client’s environment before going to production.

CloudShare, a cloud computing company that provides an amazingly flexible and easy to use cloud-computing platform for developing and testing IT applications, software, and systems wants to make it easier for SharePoint developers to create development machines, and test their client solutions! Before we go in the review, here is a description of their offering:

CloudShare’s on-demand IT environments empower users to kickstart new projects, explore new technologies, develop complex applications, and collaborate across teams without battling for limited IT infrastructure resources. Our self-service SaaS platform enables you to build, freeze and share complex multi-VM environments. CloudShare is optimized for multi-VM applications that include Oracle, MSSQL, AD, Tomcat, JBoss, WebLogic and more. Use CloudShare Labs as a secure extension of your on-premise lab and expand as needed – start small, grow when you are ready.


CloudShare Review

CloudShare offered me a temporary account so I could play with their platform. Once you login your CloudShare, you have a good looking dashboard of the current environments you have created, the current projects you are working on, as well as your latest activities.

If you want to create your first environment, you go on the Environments menu and select a new one. Then you will have the choice if you have a custom template for your project created by a team member, if you want to just do a “1 VM” machine, or if you want a three tier environment.

I looked at both the Custom Environment option, and the CloudShare Environment templates and found some pretty cool ones. For example, you can easily create a VM with SharePoint 2013, Visual Studio and Project Server installed! Everybody who installed Project Server in the past knows how much fun it is to installJ.

As you can see there are plenty of choices to choose from to match your needs! In the CloudShare Environments I found some interesting ones as well such as the small SharePoint farm that separates your AD, SQL and SharePoint.

I decided to install the small farm and play with it. One thing I realized, is that in my opinion, the ram given to the virtual machines for the Custom Environment option is a bit too low. However, this can easily be customized after if you want more horsepower. Also, some “permalinks” from the text descriptions do not link to anything. After you add the environment you want to your “cart” and click confirm, CloudShare will start creating it.

 

I was amazed, at how fast the virtual machines were created. Creating all the three virtual machines took a total of less than 10 minutes! In less than 10 minutes I had a full working SharePoint environment I was able to connect to in remote and start using it for my project. Before we open the virtual machines, let’s take a look at the interface. From your “Environment Dashboard”. As you can see in the screenshot below, in your environment dashboard you see the following:

  1. The Virtual Machine List as well as what software is included on each machine
  2. The different ways to connect to the virtual machine. You can either download an RDP file or connect remotely to it with your favorite RDP client, or you can use the VM directly from your web browser.
  3. Here is where you can add extra RAM / CPU / disk space to your virtual machines.
  4. This is in how much time of inactivity the Virtual Machine will shut down, which is very useful to not waste money when you’re not working. You can click on the “Extend Suspend” button if you’re going away for more than 1 hour, but want to keep the VM up. Otherwise, you can create a new policy that sets the suspend inactivity bar higher! Also, the environment gets auto deleted in 30 days unless you extend it!

I connected to the SharePoint virtual machine and the performance was really quite good. I didn’t see any lag in SharePoint, or a lot of “waiting on it” while browsing on the site.

One thing to note is that of course, if you manage your Virtual Machines through the web browser, the video quality is a lot more laggy than if you connect directly in remote desktop. Also, the search is a bit slow to start up after you resume your Virtual Machines.

Another part of CloudShare that I found really cool is that you can easily share the environment with other members of your team by clicking the “Share” button in your Dashboard. This will allow them to see your environment in their own dashboard as well as access it! You can also give them either Basic rights that allows them to start/stop the environment, or give them full rights to take snapshot and revert to an old snapshot.

CloudShare

Furthermore, you can also share a snapshot, or a blueprint of your environment with everyone by simply creating a permalink. A permalink is a permanent link to your environment. Each time someone clicks on your permalink, an independent, separate copy of your environment will be instantiated for that user to view, test and edit – without affecting your original prototype. The same permalink can be used over and over again.

There are a lot of billing options to fit everyone. If you just want to use it from time to time, you can use the On Demand option, however if you’re a team of developers working on projects, I recommend the Team option as it has 1200GB hours included! To learn more about the On Demand option, visit this link: http://spvlad.com/1F0T8Uc

Conclusion

As a resource-intensive development platform, SharePoint makes it tough for developers to get fast access to development machines, and even tougher to being able to simulate client environments. CloudShare wants to change that by offering an easy to use platform which allows developers to easily and rapidly create virtual machines that have everything installed without having to wait for the SharePoint Administrator to configure them properly. In my tests, I found the CloudShare Virtual Machines to be really performant and did not see any lag. I highly recommend trying their on-demand option, as you will only pay for the virtual machines that you use, without a contract and you can see if CloudShare is right for you!

To learn more about CloudShare, click the logo below:

No ratings yet.

Please rate this

The Ultimate script to download Ignite sessions that I posted earlier this week was pretty popular, and some fellow community members asked for the same script for the Microsoft Build Conference earlier this year. That is why I created this PowerShell Script so everyone can easily download them whether they were present at Build or not! Here are the features:download Build Session Videos

  • Downloads all the Microsoft Build Conference Sessions and Slides
  • Groups them by folders
  • Makes sure no errors come up due to Illegal File names.
  • If you stop the script and restart in the middle, it will start where it left off and not from beginning

This is what it will look like at the end:

download Build Session Videos

*I will update total size of downloads in the following week!

Here is the script if you want to see the code, however my WordPress plugin breaks some PowerShell, so DO NOT copy it from my blog, instead download it from Technet galleries here

Make sure you send it out to all your twitter friends by clicking the image below!

Download the script from here!  Do not copy paste from below!

Here is the source code:


[Environment]::CurrentDirectory=(Get-Location -PSProvider FileSystem).ProviderPath
$rss = (new-object net.webclient)

# Grab the RSS feed for the MP4 downloads

# SharePoint Conference 2014 Videos
$a = ($rss.downloadstring("http://s.ch9.ms/events/build/2015/rss/mp4high"))
$b = ($rss.downloadstring("http://s.ch9.ms/events/build/2015/rss/slides")) 

#other qualities for the videos only. Choose the one you want!
# $a = ($rss.downloadstring("http://s.ch9.ms/events/build/2015/rss/mp4"))
#$a = ($rss.downloadstring("http://s.ch9.ms/events/build/2015/rss/mp3")) 

#Preferably enter something not too long to not have filename problems! cut and paste them afterwards
$downloadlocation = "C:\Build"

	if (-not (Test-Path $downloadlocation)) {
		Write-Host "Folder $fpath dosen't exist. Creating it..."
		New-Item $downloadlocation -type directory
	}
set-location $downloadlocation

#Download all the slides
try { 

$b.rss.channel.item | foreach{
	$code = $_.comments.split("/") | select -last 1	   

	# Grab the URL for the PPTX file
	$urlpptx = New-Object System.Uri($_.enclosure.url)
    $filepptx = $code + "-" + $_.creator + " - " + $_.title.Replace(":", "-").Replace("?", "").Replace("/", "-").Replace("<", "").Replace("|", "").Replace('"',"").Replace("*","")
	$filepptx = $filepptx.substring(0, [System.Math]::Min(120, $filepptx.Length))
	$filepptx = $filepptx.trim()
	$filepptx = $filepptx + ".pptx"
	if ($code -ne "")
	{
		 $folder = $code + " - " + $_.title.Replace(":", "-").Replace("?", "").Replace("/", "-").Replace("<", "").Replace("|", "").Replace('"',"").Replace("*","")
		 $folder = $folder.substring(0, [System.Math]::Min(100, $folder.Length))
		 $folder = $folder.trim()
	}
	else
	{
		$folder = "NoCodeSessions"
	}

	if (-not (Test-Path $folder)) {
		Write-Host "Folder $folder dosen't exist. Creating it..."
		New-Item $folder -type directory
	}

	# Make sure the PowerPoint file doesn't already exist
	if (!(test-path "$downloadlocation\$folder\$filepptx"))
	{
		# Echo out the  file that's being downloaded
		$filepptx
		$wc = (New-Object System.Net.WebClient)  

		# Download the MP4 file
		$wc.DownloadFile($urlpptx, "$downloadlocation\$filepptx")
		mv $filepptx $folder 

	}
	}

}
catch
{
Write-host "Slides are not yet up. Run this script every day to get the latest updates"
}

#download all the mp4

# Walk through each item in the feed
$a.rss.channel.item | foreach{
	$code = $_.comments.split("/") | select -last 1	   

	# Grab the URL for the MP4 file
	$url = New-Object System.Uri($_.enclosure.url)  

	# Create the local file name for the MP4 download
	$file = $code + "-" + $_.creator + "-" + $_.title.Replace(":", "-").Replace("?", "").Replace("/", "-").Replace("<", "").Replace("|", "").Replace('"',"").Replace("*","")
	$file = $file.substring(0, [System.Math]::Min(120, $file.Length))
	$file = $file.trim()
	$file = $file + ".mp4"  

	if ($code -ne "")
	{
		 $folder = $code + " - " + $_.title.Replace(":", "-").Replace("?", "").Replace("/", "-").Replace("<", "").Replace("|", "").Replace('"',"").Replace("*","")
		 $folder = $folder.substring(0, [System.Math]::Min(100, $folder.Length))
		 $folder = $folder.trim()
	}
	else
	{
		$folder = "NoCodeSessions"
	}

	if (-not (Test-Path $folder)) {
		Write-Host "Folder $folder) dosen't exist. Creating it..."
		New-Item $folder -type directory
	}

	# Make sure the MP4 file doesn't already exist

	if (!(test-path "$folder\$file"))
	{
		# Echo out the  file that's being downloaded
		$file
		$wc = (New-Object System.Net.WebClient)  

		# Download the MP4 file
		$wc.DownloadFile($url, "$downloadlocation\$file")
		mv $file $folder
	}

#text description from session
	$OutFile = New-Item -type file "$($downloadlocation)\$($Folder)\$($Code.trim()).txt" -Force
    $Category = "" ; $Content = ""
    $_.category | foreach {$Category += $_ + ","}
    $Content = $_.title.trim() + &quot;<code>r</code>n&quot; + $_.creator + &quot;<code>r</code>n&quot; + $_.summary.trim() + &quot;<code>r</code>n&quot; + &quot;<code>r</code>n&quot; + $Category.Substring(0,$Category.Length -1)
   add-content $OutFile $Content

	}

Leave a comment and don’t forget to like the Absolute SharePoint Blog Page  on Facebook and to follow me on Twitter here  for the latest news and technical articles on SharePoint.  Also, don’t forget to check out SharePoint Community.Net for more great SharePoint Content.

No ratings yet.

Please rate this

 With the amount of great sessions at Ignite this year, there is no way you could have attended all, and even if they are posted on Channel9, you might want to download them to be able to view them offline! That is why I created this PowerShell Script so everyone can easily download Microsoft Ignite Videos AND slides whether they were present at Ignite or not! Here are the features:

download Microsoft Ignite Videos and Content

  • Downloads all the Microsoft Ignite 2015 Sessions and Slides (Note: Slides are not posted yet, but the script will download them as soon as they are)
  • Groups them by folders
  • Makes sure no errors come up due to Illegal File names.
  • If you stop the script and restart in the middle, it will start where it left off and not from beginning
  • *NEW* (11/05/2015) You can now filter by keywords in the session title!
  • *NEW* (12/05/2015) Channel9 session blocks are limited to 400 sessions, and I changed the script to download the rest! Now all 680 sessions are downloaded!
  • *NEW* (15/05/2015) Changed the WebClient download protocol to Start-Bits in order to show download progress. Added ability to filter by session code. Cleaned up script so the code & output looks better! (Thank you Dan Holme and Steve Beauge) . As a blogger, you can send your readers to download the sessions you recommend. Just tell them to use the script, and the parameter -session “Code1, Code2, Code3”

Sessions and Slides are put into folders

Download Microsoft Ignite Videos

You can now filter downloads by session code!

Download Microsoft Ignite videos PowerShell

Progress Bar

Total size of sessions is about 292GB! But sessions are still being uploaded, so might increase in the future!

 

In this blog you will see the source code of he script, however my WordPress plugin sometimes breaks some PowerShell, so DO NOT copy it from my blog,

Thanks to Jeff Collins for helping me out with the script during Ignite! Make sure you send it out to all your twitter friends by clicking the image below!

 

Download the script from here!  Do not copy paste from below!

How to use: 

  • To download all sessions just run the script! EX:

.\DownloadIgnitevideosandslidesv4.ps1 

  • To download sessions based on a keyword use the keyword parameters, and divide keywords by a comma. Make sure to use quotes around the keywords! EX:

.\DownloadIgnitevideosandslidesv4..ps1 -keyword “SharePoint,Azure,System Center

  • To download sessions based on the session code, use the session parameter and divide sessions by a comma. Make sure to use quotes around the session codes!

.\downloadignitevideosandslidesv4.ps1 -session “BRK1106,BRK1107,BRK4552”

Here is the source code:

#Script written by Vlad Catrinescu
#Visit my site www.absolute-sharepoint.com
#Twitter: @vladcatrinescu
#Originally Posted here: http://absolute-sharepoint.com/2015/05/the-ultimate-script-to-download-microsoft-ignite-videos-and-slides.html
#Contributors: Dan Holme, Jeff Collins, Steve Beaugé 

Param(
  [string]$keyword,[string]$session
)

######    Variables  #####

#Location - Preferably enter something not too long to not have filename problems! cut and paste them afterwards
$downloadlocation = &quot;C:\Ignite&quot;
#Ignite 2015 Videos RSS Feed
[Environment]::CurrentDirectory=(Get-Location -PSProvider FileSystem).ProviderPath
$rss = (new-object net.webclient)
$video1 = ($rss.downloadstring(&quot;http://s.ch9.ms/events/ignite/2015/rss/mp4high&quot;))
$video2 = ($rss.downloadstring(&quot;http://s.ch9.ms/events/ignite/2015/rss/mp4high?page=2&quot;))
$slide1 = ($rss.downloadstring(&quot;http://s.ch9.ms/events/ignite/2015/rss/slides&quot;))
$slide2 = ($rss.downloadstring(&quot;http://s.ch9.ms/events/ignite/2015/rss/slides?page=2&quot;))

#other qualities for the videos only. Choose the one you want!
# $a = ($rss.downloadstring(&quot;http://channel9.msdn.com/events/ignite/2015/rss/mp4&quot;))
# $a = ($rss.downloadstring(&quot;http://channel9.msdn.com/events/ignite/2015/rss/mp3&quot;)) 

#SCRIPT/ Functions  Do not touch below this line :)#
if (-not (Test-Path $downloadlocation)) {
		Write-Host &quot;Folder $fpath dosen't exist. Creating it...&quot;
		New-Item $downloadlocation -type directory | Out-Null
	}
set-location $downloadlocation

function CleanFilename($filename)
{
    return $filename.Replace(&quot;:&quot;, &quot;-&quot;).Replace(&quot;?&quot;, &quot;&quot;).Replace(&quot;/&quot;, &quot;-&quot;).Replace(&quot;&lt;&quot;, &quot;&quot;).Replace(&quot;|&quot;, &quot;&quot;).Replace('&quot;',&quot;&quot;).Replace(&quot;*&quot;,&quot;&quot;)
}

function DownloadSlides($filter,$videourl)
{
    try
    {
        $videourl.rss.channel.item | Where{($_.title -like “*$filter*”) -or ($_.link -like &quot;*/$filter&quot;)} |
        foreach {
	        $code = $_.comments.split(&quot;/&quot;) | select -last 1	   

	        # Grab the URL for the PPTX file
	        $urlpptx = New-Object System.Uri($_.enclosure.url)
            $filepptx = $code + &quot;-&quot; + $_.creator + &quot;-&quot; + (CleanFileName($_.title))
	        $filepptx = $filepptx.substring(0, [System.Math]::Min(120, $filepptx.Length))
	        $filepptx = $filepptx.trim()
	        $filepptx = $filepptx + &quot;.pptx&quot;
	        if ($code -ne &quot;&quot;)
	        {
		         $folder = $code + &quot; - &quot; + (CleanFileName($_.title))
		         $folder = $folder.substring(0, [System.Math]::Min(100, $folder.Length))
		         $folder = $folder.trim()
	        }
	        else
	        {
		        $folder = &quot;NoCodeSessions&quot;
	        }

	        if (-not (Test-Path $folder)) {
		        Write-Host &quot;Folder $folder dosen't exist. Creating it...&quot;
		        New-Item $folder -type directory | Out-Null
	        }

	        # Make sure the PowerPoint file doesn't already exist
	        if (!(test-path &quot;$downloadlocation\$folder\$filepptx&quot;))
	        {
		        # Echo out the  file that's being downloaded
		        write-host &quot;Downloading slides: $filepptx&quot;
		        #$wc = (New-Object System.Net.WebClient)  

		        # Download the MP4 file
		        #$wc.DownloadFile($urlpptx, &quot;$downloadlocation\$filepptx&quot;)
                Start-BitsTransfer $urlpptx &quot;$downloadlocation\$filepptx&quot; -DisplayName $filepptx
		        mv $filepptx $folder 

	        }
            else
            {
   		        write-host &quot;Slides exist: $filepptx&quot;
            }
	    }

     }

    catch
    {
        $ErrorMessage = $_.Exception.Message
        Write-host &quot;$ErrorMessage&quot;
    }
}

function DownloadVideos($filter,$slideurl)
{
#download all the mp4
# Walk through each item in the feed
$slideurl.rss.channel.item | Where{($_.title -like “*$filter*”) -or ($_.link -like &quot;*/$filter*&quot;)} | foreach{
	$code = $_.comments.split(&quot;/&quot;) | select -last 1	   

	# Grab the URL for the MP4 file
	$url = New-Object System.Uri($_.enclosure.url)  

	# Create the local file name for the MP4 download
	$file = $code + &quot;-&quot; + $_.creator + &quot;-&quot; + (CleanFileName($_.title))
	$file = $file.substring(0, [System.Math]::Min(120, $file.Length))
	$file = $file.trim()
	$file = $file + &quot;.mp4&quot;  

	if ($code -ne &quot;&quot;)
	{
		 $folder = $code + &quot; - &quot; + (CleanFileName($_.title))
		 $folder = $folder.substring(0, [System.Math]::Min(100, $folder.Length))
		 $folder = $folder.trim()
	}
	else
	{
		$folder = &quot;NoCodeSessions&quot;
	}

	if (-not (Test-Path $folder)) {
		Write-Host &quot;Folder $folder) dosen't exist. Creating it...&quot;
		New-Item $folder -type directory | Out-Null
	}

	# Make sure the MP4 file doesn't already exist

	if (!(test-path &quot;$folder\$file&quot;))
	{
		# Echo out the  file that's being downloaded
		write-host &quot;Downloading video: $file&quot;
		#$wc = (New-Object System.Net.WebClient)  

		# Download the MP4 file
		Start-BitsTransfer $url &quot;$downloadlocation\$file&quot; -DisplayName $file
		mv $file $folder
	}
    else
    {
   		write-host &quot;Video exists: $file&quot;
    }

#text description from session
	$OutFile = New-Item -type file &quot;$($downloadlocation)\$($Folder)\$($Code.trim()).txt&quot; -Force
    $Category = &quot;&quot; ; $Content = &quot;&quot;
    $_.category | foreach {$Category += $_ + &quot;,&quot;}
    $Content = $_.title.trim() + &quot;<code>r</code>n&quot; + $_.creator + &quot;<code>r</code>n&quot; + $_.summary.trim() + &quot;<code>r</code>n&quot; + &quot;<code>r</code>n&quot; + $Category.Substring(0,$Category.Length -1)
   add-content $OutFile $Content

	}
}

if ($keyword)
{
    $keywords = $keyword.split(&quot;,&quot;)

    foreach ($k in $keywords)
    {
        $k.trim()
        Write-Host &quot;You are now downloading the sessions with the keyword $k&quot;
        DownloadSlides $k $slide1
        DownloadSlides $k $slide2
        DownloadVideos $k $video1
        DownloadVideos $k $video2
    }
}
elseif ($session)
{
    $sessions = $session.Split(&quot;,&quot;)

    foreach ($s in $sessions)
    {
        $s.trim()
        Write-Host &quot;You are now downloading the session $s&quot;
        DownloadSlides $s $slide1
        DownloadSlides $s $slide2
        DownloadVideos $s $video1
        DownloadVideos $s $video2
    }

}
else
{
    DownloadSlides &quot; &quot; $slide1
    DownloadSlides &quot; &quot; $slide2
    DownloadVideos &quot; &quot; $video1
    DownloadVideos &quot; &quot; $video2
}

No ratings yet.

Please rate this

Community Blast Provided and Sponsored by Formotus. This information was provided by vendor for community education on this InfoPath Alternative product. No official review was performed by Vlad Catrinescu.

There’s plenty to talk about in the Formotus booth at Microsoft Ignite this week, as the company has announced a flurry of new offerings and upcoming beta previews. Here’s what’s on their list:

  1. Forms on demand with Formotus Now. Formotus Now is a new mobile app that lets anyone open InfoPath-compatible forms without any sign-in, simply by tapping a link.
  2. Browser-based form design. As promised, work is underway on the new cloud-based Formotus alternative to InfoPath Designer, and an early demo is on display.
  3. One-click open from a browser. Create a column in a SharePoint form library containing a Formotus link, and click on it open an existing instance (xml file) in a mobile app for filling.
  4. SharePoint list connector. This new custom control for InfoPath allows for updating SharePoint list data on the fly. One form can be used to update multiple lists.
  5. More ways to capture mobile data. Now in addition to camera photos, ink signatures, and GPS locations, Formotus has rolled out more controls for camera-captured barcodes, photos with location and compass direction, and map image insertion.
  6. Robust data ecosystem. There are several new ways that Formotus forms can now interact with each other and with other apps. One form can open another and pass data to prefill its fields. A link on a site or in email can open a form with parameters to fill its fields. A form can query a SharePoint library for available instances, then open one. An external, public-facing form can initiate internal SharePoint processes such as workflows.

If you’re in Chicago at Ignite this week, drop by booth 587 for a chat and a demo. If not, you can read more about these new developments here

InfoPath Alternative

No ratings yet.

Please rate this