<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://developer.nirvanix.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Developer Blog</title><subtitle type="html" /><id>http://developer.nirvanix.com/blogs/developer_blog/atom.aspx</id><link rel="alternate" type="text/html" href="http://developer.nirvanix.com/blogs/developer_blog/default.aspx" /><link rel="self" type="application/atom+xml" href="http://developer.nirvanix.com/blogs/developer_blog/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20611.960">Community Server</generator><updated>2008-05-29T15:34:00Z</updated><entry><title>MD5 Validation for Perl</title><link rel="alternate" type="text/html" href="http://developer.nirvanix.com/blogs/developer_blog/archive/2010/01/13/md5-validation-for-perl.aspx" /><id>http://developer.nirvanix.com/blogs/developer_blog/archive/2010/01/13/md5-validation-for-perl.aspx</id><published>2010-01-13T19:55:00Z</published><updated>2010-01-13T19:55:00Z</updated><content type="html">&lt;p&gt;Verifying the files you have stored on our servers is an important part of data integrity.&amp;nbsp; To calculate the MD5 we store on our servers in Perl the quick solution would be to use the built in b64digest output which is part of the Digest::MD5 class.&lt;br /&gt;&lt;br /&gt;For the test file the MD5 being returned by Nirvanix ListFolder is: bNIkeoRicdpTMoPyuN/4rg==&lt;/p&gt;&lt;pre&gt;&lt;br /&gt;use Digest::MD5;&lt;br /&gt;use MIME::Base64;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $file = shift || &amp;quot;./somefile.txt&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; open(FILE, $file) or die &amp;quot;Can&amp;#39;t open &amp;#39;$file&amp;#39;: $!&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; binmode(FILE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print Digest::MD5-&amp;gt;new-&amp;gt;addfile(*FILE)-&amp;gt;b64digest, &amp;quot; $file\n&amp;quot;;&lt;/pre&gt;&lt;br /&gt;output:&lt;br /&gt;bNIkeoRicdpTMoPyuN/4rg ./somefile.txt&lt;br /&gt;&lt;br /&gt;For some reason this does not produce the expecting padding of: ==&lt;br /&gt;&lt;br /&gt;If you change the script slightly to call the base 64 encoding externally using the digest output (binary MD5) then it will report the correct value.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;use Digest::MD5;&lt;br /&gt;use MIME::Base64;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $file = shift || &amp;quot;./somefile.txt&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; open(FILE, $file) or die &amp;quot;Can&amp;#39;t open &amp;#39;$file&amp;#39;: $!&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; binmode(FILE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print encode_base64(Digest::MD5-&amp;gt;new-&amp;gt;addfile(*FILE)-&amp;gt;digest), &amp;quot; $file\n&amp;quot;;&lt;/pre&gt;&lt;br /&gt;output:&lt;br /&gt;bNIkeoRicdpTMoPyuN/4rg==&lt;br /&gt;&amp;nbsp;./somefile.txt&lt;br /&gt;&lt;br /&gt;It is important that you do not just add == to the results of the b64digest since this is not always returned (though usually is).&amp;nbsp; There are cases when the extra bytes are used by the base64 algorithm.&lt;br /&gt;&lt;br /&gt;
&lt;img src="http://developer.nirvanix.com/aggbug.aspx?PostID=2288" width="1" height="1"&gt;</content><author><name>BarryR</name><uri>http://developer.nirvanix.com/members/BarryR.aspx</uri></author><category term="md5" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/md5/default.aspx" /><category term="perl" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/perl/default.aspx" /><category term="base64" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/base64/default.aspx" /></entry><entry><title>SDN URL Redirection</title><link rel="alternate" type="text/html" href="http://developer.nirvanix.com/blogs/developer_blog/archive/2009/09/16/best-practices-sdn-redirect.aspx" /><id>http://developer.nirvanix.com/blogs/developer_blog/archive/2009/09/16/best-practices-sdn-redirect.aspx</id><published>2009-09-16T16:41:00Z</published><updated>2009-09-16T16:41:00Z</updated><content type="html">&lt;p&gt;&lt;font face="Calibri, Verdana, Helvetica, Arial"&gt;&lt;span style="font-size:11pt;"&gt;The dynamic nature of our system allows us to automatically route uploads and downloads to the best node for optimal performance and to ensure system availability during maintenance or heavy load. &amp;nbsp;This is done by coding URLs to “http://services.nirvanix.com” and allowing the SDN to automatically redirect them to the appropriate node. This is a very important feature that all customers need to follow to ensure the best user experience.&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
SDN files can be accessed in three ways, specifically by using a: (1) session-based URL, (2) hosted-item URL, or (3) tokenized URL.&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
1. A session-based URL is codified using the form: “http://services.nirvanix.com/SESSIONTOKEN/PATH/FILENAME”. The SESSIONTOKEN is created by the “&lt;a href="http://developer.nirvanix.com/sitefiles/1000/API.html#_Toc175999910"&gt;Login&lt;/a&gt;” API call. &amp;nbsp;This URL is automatically redirected to the closest active node that contains the requested SDN file.&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
2. A hosted-file URL is codified using the form: “http://services.nirvanix.com/APPNAME/ACCOUNT/PATH/FILENAME”. Hosted files are created using the “&lt;a href="http://developer.nirvanix.com/sitefiles/1000/API.html#_Toc175999941"&gt;CreateHostedItem&lt;/a&gt;” API call. Similar to session-based URLs, this URL is automatically redirected to the closest active node that contains the requested SDN file.&lt;br /&gt;
&lt;br /&gt;
3. A tokenized URL for an SDN file is generated by the “&lt;a href="http://developer.nirvanix.com/sitefiles/1000/API.html#_TocGetOptimalUrls"&gt;GetOptimalURLs&lt;/a&gt;” API call. &amp;nbsp;The resulting URL points to a specific node that contains the file when “GetOptimalURLs” was called. &amp;nbsp;However, if the node is unavailable or the SDN file is subsequently migrated to a different node, then the tokenized URL will return an error and not resolve to the file (even if the URL hasn’t expired yet). &amp;nbsp;For that reason, we recommend specifying a short expiration period for tokenized URLs and implementing error handling, e.g. regenerating the URL using “GetOptimalURLs” if the file is unavailable.&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
All three of these methods use IP-based geo-location services to determine the closest active node. &amp;nbsp;Session-based and hosted-item URLs resolve to the datacenter closest to the client accessing the file. &amp;nbsp;Tokenized URLs are fixed to the node closest to the IP address passed to the “GetOptimalURLs” API call.&lt;br /&gt;
&lt;br /&gt;
Uploads are treated similarly to the “GetOptimalURLs” call, such that a token is generated that allows you to upload to a specific node. &amp;nbsp;You must call “&lt;a href="http://developer.nirvanix.com/sitefiles/1000/API.html#_Toc175999927"&gt;GetStorageNode&lt;/a&gt;” or “&lt;a href="http://developer.nirvanix.com/sitefiles/1000/API.html#_TocGetStorageNodeExtended"&gt;GetStorageNodeExtended&lt;/a&gt;” for each file being uploaded.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;img src="http://developer.nirvanix.com/aggbug.aspx?PostID=2154" width="1" height="1"&gt;</content><author><name>BarryR</name><uri>http://developer.nirvanix.com/members/BarryR.aspx</uri></author></entry><entry><title>A Feature Review</title><link rel="alternate" type="text/html" href="http://developer.nirvanix.com/blogs/developer_blog/archive/2009/06/20/a-feature-review.aspx" /><id>http://developer.nirvanix.com/blogs/developer_blog/archive/2009/06/20/a-feature-review.aspx</id><published>2009-06-20T01:09:00Z</published><updated>2009-06-20T01:09:00Z</updated><content type="html">&lt;p&gt;I wanted to go over the different releases over the last year or so to give a quick overview of what has been done.&amp;nbsp; It can be a challenge to read through our release notes in the forums if you are not already a customer so a roll-up is in order.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;The build out of 4 nodes including Japan and Europe.&lt;br /&gt;&lt;br /&gt;CloudNAS for Windows and Linux - We have been focusing on offering significant speed and simplicity to allow you to mount the file system as a network drive.&amp;nbsp; We have released many new features allowing significant performance improvements and compatibility with many different backup and other server solutions.&lt;br /&gt;&lt;br /&gt;Improved services server - The services servers received a significant improvement to speed and scalability to allow for even faster requests and allowing significant redundancy.&lt;br /&gt;&lt;br /&gt;Output as JSON - We announced output as JSON in our latest release which allows integration with JavaScript making web site integration easier.&lt;br /&gt;&lt;br /&gt;Network Improvements - All of our nodes are continually being improved for network performance.&amp;nbsp; The overall transfer speed for many of our customers have been many fold improvements for upload and download.&amp;nbsp; This is something we consider one of the most important features of our service.&lt;br /&gt;&lt;br /&gt;Reliability - While I cannot detail the improvements made in this regard there have been significant changes like improved error handling in the last 6 months.&amp;nbsp; Features cannot be measured if there is no service running so this is a top concern for us.&lt;br /&gt;&lt;br /&gt;White Lists - The ability to create IP ranges that restrict download of public files to only those IPs.&lt;br /&gt;&lt;br /&gt;Customer Support - The management portal has been enhanced in numerous ways including a ticketing system for support entries and full child account modification and creation.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This is not a complete list but it is a quick way to catch up on what we have been working on in our drive to add features and provide a great platform to build your application on. &lt;br /&gt;&lt;/p&gt;&lt;img src="http://developer.nirvanix.com/aggbug.aspx?PostID=2002" width="1" height="1"&gt;</content><author><name>BarryR</name><uri>http://developer.nirvanix.com/members/BarryR.aspx</uri></author><category term="feature review" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/feature+review/default.aspx" /></entry><entry><title>Streaming and Seeking in Silverlight with Nirvanix</title><link rel="alternate" type="text/html" href="http://developer.nirvanix.com/blogs/developer_blog/archive/2009/05/08/streaming-and-seeking-in-silverlight-with-nirvanix.aspx" /><id>http://developer.nirvanix.com/blogs/developer_blog/archive/2009/05/08/streaming-and-seeking-in-silverlight-with-nirvanix.aspx</id><published>2009-05-08T17:36:00Z</published><updated>2009-05-08T17:36:00Z</updated><content type="html">Silverlight offers some great video playback features in terms of allowing progressive download and offering a method to index and seek WMV.&amp;nbsp; This is a great way to allow complete freedom in displaying movie playback while using a progressive download server such as a Nirvanix account.&lt;br /&gt;&lt;br /&gt;The normal buffering that you would see with any progressive downloaded Flash or Silverlight video is still happening, but because the WMV is indexed the player can skip to any point in the video and start buffering / playing from that point.&amp;nbsp; Once you have your video completed you can upload the file along with some HTML to invoke the player.&amp;nbsp; The player I have chosen below is quite nice because it is open source, supports the seeking capability and is quite attractive.&lt;br /&gt;&lt;br /&gt;The link below is a demo of movie length content which lets you move the slider to any point.&lt;br /&gt;&lt;br /&gt;Demo:&lt;br /&gt;&lt;a href="http://services.nirvanix.com/NirvanixDrive/barrynirvanix/silverlight/silverlighttest.html" target="_blank"&gt;http://services.nirvanix.com/NirvanixDrive/barrynirvanix/silverlight/silverlighttest.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;object data=&amp;quot;data:application/x-silverlight-2,&amp;quot; type=&amp;quot;application/x-silverlight-2&amp;quot; height=&amp;quot;480&amp;quot; width=&amp;quot;640&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param name=&amp;quot;source&amp;quot; value=&amp;quot;VideoPlayer.xap&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param name=&amp;quot;background&amp;quot; value=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param name=&amp;quot;initParams&amp;quot; value=&amp;quot;m=http://services.nirvanix.com/App/User/PathtoFile/Video.wmv&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param name=&amp;quot;minruntimeversion&amp;quot; value=&amp;quot;2.0.31005.0&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href=&amp;quot;http://go.microsoft.com/fwlink/?LinkId=124807&amp;quot; style=&amp;quot;text-decoration: none;&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;img src=&amp;quot;http://go.microsoft.com/fwlink/?LinkId=108181&amp;quot; alt=&amp;quot;Get Microsoft Silverlight&amp;quot; style=&amp;quot;border-style: none;&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/a&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/object&amp;gt;&lt;br /&gt;&lt;br /&gt;The object above can be placed in your HTML and will render the video using the VideoPlayer.xap.&amp;nbsp; You can place the html, player and video in a directory and share that directory to allow the file to be played back.&lt;br /&gt;&lt;br /&gt;The HTML code used to load the player can be downloaded here:&lt;br /&gt;&lt;br /&gt;The SL2 Video Player:&lt;br /&gt;&lt;a href="http://sl2videoplayer.codeplex.com/"&gt;http://sl2videoplayer.codeplex.com/&lt;/a&gt;&lt;img src="http://developer.nirvanix.com/aggbug.aspx?PostID=1927" width="1" height="1"&gt;</content><author><name>BarryR</name><uri>http://developer.nirvanix.com/members/BarryR.aspx</uri></author></entry><entry><title>Video Playback Tutorial</title><link rel="alternate" type="text/html" href="http://developer.nirvanix.com/blogs/developer_blog/archive/2008/12/16/video-playback-tutorial.aspx" /><id>http://developer.nirvanix.com/blogs/developer_blog/archive/2008/12/16/video-playback-tutorial.aspx</id><published>2008-12-16T18:48:00Z</published><updated>2008-12-16T18:48:00Z</updated><content type="html">&lt;p&gt;Often you will want to play the video stored on your Nirvanix account. One of the easiest formats to play back would be FLV since Adobe has done most of the hard work in flash already.&amp;nbsp; You have the option to either create a player in flash or you can purchase one of the many that are available.&amp;nbsp; This tutorial will describe how to convert a video in avi format to FLV then upload, transcode and setup a player.&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Uploading the AVI&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;For this step we will use the PHP Web Client.&amp;nbsp; You can find a sample site running at: &lt;a href="http://www.nirvanixtest.com/webclient/"&gt;http://www.nirvanixtest.com/webclient/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you intend to use this extensively you should get the source and put the site up on your own server. &amp;nbsp; To upload we will create a folder in the root called &amp;quot;video&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://developer.nirvanix.com/blogs/developer_blog/upload.png"&gt;&lt;img src="http://developer.nirvanix.com/blogs/developer_blog/upload.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt; Transcoding to FLV&lt;/span&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;After the upload is complete you can browse to the upload folder and click on the file you want to transcode and click on Transcode Video.&lt;/p&gt;&lt;p&gt;&lt;a href="http://developer.nirvanix.com/blogs/developer_blog/transcode-1.png"&gt;&lt;img src="http://developer.nirvanix.com/blogs/developer_blog/transcode-1.png" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Once you have selected the video to transcode you will need to type the destination file and path along with the transcode quality.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://developer.nirvanix.com/blogs/developer_blog/transcode-2.png"&gt;&lt;img src="http://developer.nirvanix.com/blogs/developer_blog/transcode-2.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;After you click on &amp;quot;Transcode File&amp;quot; It may take a few minutes to process the request in the background.&amp;nbsp; Depending on the size of the file the time will vary.&amp;nbsp; You can refresh the destination folder to know when the conversion has completed.&amp;nbsp; Normally you would have a process in the background listening to the callbackURL which will be called when the video transcode is complete.&lt;/p&gt;&lt;p&gt;&lt;a href="http://developer.nirvanix.com/blogs/developer_blog/transcoded.png"&gt;&lt;img src="http://developer.nirvanix.com/blogs/developer_blog/transcoded.png" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Embed Flash in HTML&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;Once you have the video converted to FLV you will need to upload a player to this directory.&amp;nbsp; For this tutorial we have selected the moxiecode FLV player because it is a simple example that follows the logic that most web flash applications use.&amp;nbsp; You can find a copy at: &lt;a href="http://oos.moxiecode.com/flvplayer/"&gt;http://oos.moxiecode.com/flvplayer/&lt;/a&gt; along side: &lt;a href="http://blog.deconcept.com/swfobject/"&gt;http://blog.deconcept.com/swfobject/&lt;/a&gt; which is used to render the swf object through javascript without too much more work.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Upload the flvPlayer.swf and swfobject.js to the movies folder along side the FLV.&amp;nbsp; This will be the movie player you will be using that is embedded in the html page we will be creating.&amp;nbsp; Once this is done you can upload the html page to the same folder.&lt;/p&gt;&lt;p&gt;&amp;nbsp;You can view the working html sample here: &lt;a href="http://services.nirvanix.com/Movie%20Viewer/movietest/movies/video.html"&gt;&lt;span style="text-decoration:underline;"&gt;http://services.nirvanix.com/Movie Viewer/movietest/movies/video.html&lt;/span&gt;&lt;/a&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://developer.nirvanix.com/aggbug.aspx?PostID=1756" width="1" height="1"&gt;</content><author><name>BarryR</name><uri>http://developer.nirvanix.com/members/BarryR.aspx</uri></author></entry><entry><title>Silverlight Support</title><link rel="alternate" type="text/html" href="http://developer.nirvanix.com/blogs/developer_blog/archive/2008/09/16/silverlight-support.aspx" /><id>http://developer.nirvanix.com/blogs/developer_blog/archive/2008/09/16/silverlight-support.aspx</id><published>2008-09-16T17:44:00Z</published><updated>2008-09-16T17:44:00Z</updated><content type="html">&lt;p&gt;We are happy to announce we have added the ability to access your content from Silverlight.&amp;nbsp; The latest release added a file at the root of both servies and the nodes that is a security file allowing Silverlight to connect to and download from both API calls as well as files.&amp;nbsp; Part of the release was to add the Microsoft suggested Mime-types for hosting Silverlight files as well.&amp;nbsp; Some restrictions on hosting the Silverlight application may be having to call the node directly to avoid the redirect.&lt;/p&gt;&lt;p&gt;The security file can be accessed at: &lt;a href="http://services.nirvanix.com/clientaccesspolicy.xml"&gt;http://services.nirvanix.com/clientaccesspolicy.xml&lt;/a&gt; and at the root of each node as well.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I look forward to our Silverlight developers showing off the latest interfaces to access both API calls and file downloads in the future.&amp;nbsp; Please post a comment if you have a questions or concerns.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://developer.nirvanix.com/aggbug.aspx?PostID=1546" width="1" height="1"&gt;</content><author><name>BarryR</name><uri>http://developer.nirvanix.com/members/BarryR.aspx</uri></author><category term="Silverlight" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/Silverlight/default.aspx" /></entry><entry><title>Callbacks and communicating with processing</title><link rel="alternate" type="text/html" href="http://developer.nirvanix.com/blogs/developer_blog/archive/2008/08/14/callbacks-and-communicating-with-processing.aspx" /><id>http://developer.nirvanix.com/blogs/developer_blog/archive/2008/08/14/callbacks-and-communicating-with-processing.aspx</id><published>2008-08-14T07:50:00Z</published><updated>2008-08-14T07:50:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;I have received a number of direct questions from Nirvanix users regarding callbacks and thought that I would share the information I sent to them with the entire community. Our processing servers allow you to work on requests that may take a significant amount of time.&amp;nbsp; This means you can transcode videos that are &amp;gt; 200gb or any number of other supported large file operations.&amp;nbsp; When processing a large file it&amp;#39;s necessary to move these calls to an asynchronous process to avoid keeping an active connection open.&amp;nbsp; Web interfaces aren&amp;#39;t the best mechanism for long running connections and it can take quite a while to transcode a 200gb video depending on the CODEC. This setup requires a way to let you know when we are finished with the operation, this is where callbacks are used.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;When something is added to our queue it will be picked up by our processing servers and when they are done with the request they will make a call to the URL presented in the initial request.&amp;nbsp; The data returned depends on what operation you were performing.&amp;nbsp; There will always be a response code passed which if 0 means the command succeeded as expected.&amp;nbsp; If it is non-zero there will also be an error message. This is necessary because the initial call to the method only adds the request to the queue and does not actually perform the operation. You should receive two separate callbacks, the first is a notification that the file has been added to the queue successfully (or un successfully) and the second is notification that the file has been processed successfully (or unsuccessfully).&amp;nbsp; Cases where the initial notification would not be 0 include paths already existing, users reaching their set limits or other problems.&lt;/p&gt;
&lt;p&gt;The callback URL you submit to us is in the following format http://www.mysite.com/mycallback.php which would reside on your site.&lt;/p&gt;&lt;p&gt;Once a file has completed processing you will receive the following information:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NVX.returnCode&lt;/b&gt; an integer representing the status of the upload. Did it fail? Succedd? For valid response codes: see standard return codes; return code 0 means no error.&lt;br /&gt;&lt;b&gt;NVX.errorMessage&lt;/b&gt; a string describing the error message associated with any error being returned.&lt;br /&gt;&lt;b&gt;NVX.absolutePath&lt;/b&gt; a string describing the absolute path of the file that was uploaded.&lt;br /&gt;&lt;b&gt;NVX.sizeBytes&lt;/b&gt; a long describing the size in bytes of the file that was uploaded. &lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Transcoding Audio / Video&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The transcode calls can take some time to convert the files depending on the input and output formats as well as the quality settings.&amp;nbsp; For this callback the operation will only return if the call was successful as well as any errors that have occurred during processing.&amp;nbsp; If you are converting to FLV / MP3 formats you can use this callback to determine when you should make the files visible to the users of your system.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Image Resize / Rotate&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The image calls usually occur very quickly and will return if the call
was successful as well as any errors that have occurred during
processing.&amp;nbsp; Possible reasons for failure would be that the submitted format is unknown to us.&amp;nbsp; Often this call is used to swap a preview image with a generated thumbnail.&amp;nbsp; This can be a good queue for your system to present a resized image instead of a stock icon if you have a way to show previews of image files on your system.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Sideload&lt;/b&gt; &lt;/p&gt;
&lt;p&gt;For sideloads we are actually going out on the web and making requests of external sites which can have significant overhead if the site we are contacting should be slow or unresponsive.&amp;nbsp; It is critical that you capture sideload errors since this is calling to an external system which can often behave in unexpected ways.&amp;nbsp; The sideload call is a great way to save external data into your account without having to proxy the files through your own system.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Upload&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Uploads are different in what they return so you can do post processing on a file after it has been uploaded.&amp;nbsp; Often systems using our web services allow users to upload directly to our servers which allows you to avoid proxying files and letting your customers upload the files directly to us.&amp;nbsp; The challenge is having a way to update your system or local database with the files those users have uploaded.&amp;nbsp; The callback can be used as a convenient way to keep your local system informed of when a user uploads their own file.&amp;nbsp; Another use of this callback is to execute a secondary action when the upload is complete.&amp;nbsp; You can check the file for the extension to see if its allowed, generate a thumbnail on an image or any number of operations. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;b&gt;Sample Callback Handler in PHP&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&amp;lt;?php &lt;br /&gt;&lt;br /&gt;$myFile = &amp;quot;requestlog.txt&amp;quot;;&lt;br /&gt;$fh = fopen($myFile, &amp;#39;a&amp;#39;) or die(&amp;quot;can&amp;#39;t open file&amp;quot;);&lt;br /&gt;fwrite($fh, &amp;#39;Requesting URI: &amp;#39; . $_SERVER[&amp;#39;REQUEST_URI&amp;#39;] . &amp;quot;\r\n&amp;quot;);&lt;br /&gt;fwrite($fh, &amp;#39;Request Time: &amp;#39; . date(&amp;quot;D M j G:i:s T Y&amp;quot;) . &amp;quot;\r\n&amp;quot;);&lt;br /&gt;fwrite($fh, &amp;#39;Query String: &amp;#39; . $_SERVER[&amp;#39;QUERY_STRING&amp;#39;] . &amp;quot;\r\n\r\n&amp;quot;);&lt;br /&gt;&lt;br /&gt;fclose($fh);&lt;br /&gt;&lt;br /&gt;?&amp;gt; &lt;/pre&gt;The handler will append the results of each callback to a file called requestlog.txt.&amp;nbsp; Make sure your web server (PHP) has write privileges to that file.&lt;br /&gt;
&lt;img src="http://developer.nirvanix.com/aggbug.aspx?PostID=1450" width="1" height="1"&gt;</content><author><name>BarryR</name><uri>http://developer.nirvanix.com/members/BarryR.aspx</uri></author><category term="transcode" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/transcode/default.aspx" /><category term="sideload" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/sideload/default.aspx" /><category term="image" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/image/default.aspx" /><category term="upload" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/upload/default.aspx" /><category term="resize" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/resize/default.aspx" /><category term="callbacks" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/callbacks/default.aspx" /></entry><entry><title>ItemID Changes</title><link rel="alternate" type="text/html" href="http://developer.nirvanix.com/blogs/developer_blog/archive/2008/07/02/itemid-changes.aspx" /><id>http://developer.nirvanix.com/blogs/developer_blog/archive/2008/07/02/itemid-changes.aspx</id><published>2008-07-02T15:35:00Z</published><updated>2008-07-02T15:35:00Z</updated><content type="html">&lt;p&gt;We wanted to let everyone know of a change to the ItemID structure.&amp;nbsp; This is significant if you are storing the ItemID along with your file information.&amp;nbsp; This ID was improved to make sure it will always be Unique across an application.&amp;nbsp; Since the change will affect existing item ID&amp;#39;s we suggest that if you are already storing the Item ID you update your database with the new value returned from &lt;a href="http://developer.nirvanix.com/sitefiles/1000/API.html#_TocGetPathInfo"&gt;GetPathInfo&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Please let us know if you have a large number of Item IDs stored or if you will have any trouble with this change.&amp;nbsp; We will work with you through the transition.&amp;nbsp; We will be making the change on the next release date that is targeted for next week.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://developer.nirvanix.com/aggbug.aspx?PostID=1292" width="1" height="1"&gt;</content><author><name>BarryR</name><uri>http://developer.nirvanix.com/members/BarryR.aspx</uri></author></entry><entry><title>Base Storage </title><link rel="alternate" type="text/html" href="http://developer.nirvanix.com/blogs/developer_blog/archive/2008/06/21/base-storage.aspx" /><id>http://developer.nirvanix.com/blogs/developer_blog/archive/2008/06/21/base-storage.aspx</id><published>2008-06-21T20:15:00Z</published><updated>2008-06-21T20:15:00Z</updated><content type="html">&lt;p&gt;All,&lt;/p&gt;&lt;p&gt;We have removed the option to sign up for base storage from our sign up process. This will not affect those of you who are currently signed up for Base storage and your service activity will continue to be locked to the node you specified. We did this because of the benefits our SDN customers have experienced allowing the intelligent uploading, downloading, and movement of files throughout the global Storage Delivery Network. We continue to work hard to provide you with the highest quality Cloud Storage service possible. If you have any questions feel free to contact us at info@nirvanix.com and as always thank you for your continued support.&lt;/p&gt;&lt;p&gt;Aj &lt;br /&gt;&lt;/p&gt;&lt;img src="http://developer.nirvanix.com/aggbug.aspx?PostID=1228" width="1" height="1"&gt;</content><author><name>adrian</name><uri>http://developer.nirvanix.com/members/adrian.aspx</uri></author></entry><entry><title>Staying Secure, Security Best Practices</title><link rel="alternate" type="text/html" href="http://developer.nirvanix.com/blogs/developer_blog/archive/2008/05/29/staying-secure.aspx" /><id>http://developer.nirvanix.com/blogs/developer_blog/archive/2008/05/29/staying-secure.aspx</id><published>2008-05-29T15:34:00Z</published><updated>2008-05-29T15:34:00Z</updated><content type="html">&lt;p&gt;The security model we have designed allows for a few options when deciding how to stay secure.&amp;nbsp; Today&amp;#39;s topic will be to explore security and how you can be sure you know all of the primary methods for keeping data and your credentials secure.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;b&gt;Authentication&lt;/b&gt; &lt;/p&gt;&lt;p&gt;A session token is generated using an
application key, username and password.&amp;nbsp; With these three credentials
you authenticate to a specific application.&amp;nbsp; Its important that you
secure the Application Key because like your username it is also part
of the total authentication into the system.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Passwords&lt;/b&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Each of the password change methods
require a full re-authentication by the user.&amp;nbsp; This is to prevent
someone from stealing a session token and taking over an account.&amp;nbsp; If
you use SSL there should be no way for an external party to take over
your account. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Session Tokens&lt;/b&gt; &lt;/p&gt;&lt;p&gt;The session token was designed to give you a sliding window in which you can operate on the APIs from a single external location.&amp;nbsp; A session token is in essence the key to our web services after you have proven you are who you say you are.&amp;nbsp; This token is locked to a single IP Address always.&amp;nbsp; This is because a session token is something that is very specific to a user and should never be given to anyone else.&amp;nbsp; &lt;/p&gt;&lt;p&gt;The session token not only will let you get access to the web services but it will also let you download your files.&amp;nbsp; Below is a URL that has been built based on a session token that will access the file file.txt in &amp;quot;application1&amp;quot; and childuser1 which in this example is a child account.&lt;/p&gt;&lt;p&gt;http://services.nirvanix.com/SESSIONTOKEN/application1/childuser1/path/file.txt&lt;/p&gt;&lt;p&gt;Session tokens stay active for 20 minutes unless they are used.&amp;nbsp; Whenever a session token is used it will be updated to be active for another 20 minutes.&amp;nbsp; This means if your session token stays active it could be available indefinately.&amp;nbsp; Because of this its a good idea to call logout which destroys a session token.&amp;nbsp; The reason this is important is to prevent anyone who may be watching your http traffic.&lt;/p&gt;&lt;p&gt;The best use case for a session token is to login, do a single operation using HTTPS and then logout.&amp;nbsp; However, there are a number of reasons this isn&amp;#39;t always possible.&amp;nbsp; If you have large amounts of data to pass or are extremely time sensitive the addition of SSL could be too much overhead.&amp;nbsp; If you find yourself in such a situation be aware that if someone is able to get a session token they will still have to try to spoof your IP Address to use the token.&amp;nbsp; This is why its always a best practice to call logout at any time you have completed your operation because that will instantly invalidate the session token assuring you that no-one else may use that token either. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Upload Tokens&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The upload token is another form of validation that can be created to allow users to interact with the system.&amp;nbsp; The reason the upload token is separate from session tokens is to allow the ability to pass to the end client in a web site scenario this token to do an upload.&amp;nbsp; If a session token were used the end client could use that token to call any method under their account.&amp;nbsp; With the addition of the GetStorageNodeExtended method you can now also lock an upload token to a specific IP and allow them to only upload to a specific directory.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Download Tokens&lt;/b&gt;&lt;/p&gt;&lt;p&gt;A token can be generated with GetOptimalURLs which lets you access a file for a specified period of time.&amp;nbsp; The token can be created in a way that is similar to upload tokens that allows you to only allow a specific IP Address.&amp;nbsp; The download tokens will timeout after a specified period of time.&amp;nbsp; The suggestion is always to keep the timeout as short as possible since this token cannot be destroyed later.&amp;nbsp; If you distribute the link and it is not locked to a specific IP Address anyone can download that file until it expires.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Password Locking&lt;/b&gt;&lt;/p&gt;&lt;p&gt;If the login system is called and fails 5 times your login will be locked.&amp;nbsp; This is a temporary lock that will be released after 15 minutes.&amp;nbsp; This is necessary to prevent attempts at guessing passwords.&amp;nbsp; You can unlock your account at the Nirvanix Management Portal (NMP) (&lt;a href="http://nmp.nirvanix.com/"&gt;http://nmp.nirvanix.com/&lt;/a&gt;) using the security question answer.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Re-setting Application Key&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The application key should be considered a secure item since it identifies your application.&amp;nbsp; Should someone get your application key and you are concerned that you have been compromised you can regenerate it using the NMP.&amp;nbsp; Any applications using the old key will not be able to login again until the new application key is used.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Additional Security Information&lt;/b&gt;&lt;/p&gt;&lt;p&gt;A whitepaper is available that details eavesdropping, impersonation and database attacks. You can find this and other important whitepapers at: &lt;a href="http://www.nirvanix.com/resources.aspx#wp"&gt;Nirvanix Whitepapers&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://developer.nirvanix.com/aggbug.aspx?PostID=835" width="1" height="1"&gt;</content><author><name>BarryR</name><uri>http://developer.nirvanix.com/members/BarryR.aspx</uri></author><category term="upload token" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/upload+token/default.aspx" /><category term="login" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/login/default.aspx" /><category term="Security" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/Security/default.aspx" /><category term="authentication" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/authentication/default.aspx" /><category term="passwords" scheme="http://developer.nirvanix.com/blogs/developer_blog/archive/tags/passwords/default.aspx" /></entry></feed>