Posting this for future reference this winter. The lesson being: be grateful you don’t live in Canada.
Thanks Micah for posting this.
Random Technology Musings
Posting this for future reference this winter. The lesson being: be grateful you don’t live in Canada.
Thanks Micah for posting this.
I removed and then replaced a hard drive on WHS earlier today. Since there are only 4 internal SATA ports and all my extra USb enclosures don’t work, i had to disconnect one of the drives and connect the drive i was removing. The reason for this was that due to space constraints, the new drive had to go in first so that the Drive remove Wizard could migrate data to it.
Anyway, once I had everything sorted, the Backup Service refused to run. Even after I did everything (clear file conflicts etc) that is suggested in help files, it’s still not running. So as a last resort I went to delete all backups. This is what I got.
I can’t find anything on this anywhere. Any ideas?
I suspect this is some sort of deep problem somewhere in the bowls of WHS. If thats the case, it would indicate a re-install of WHS itself. And thats something which I’m very hesitant to do.
UPDATE: Thanks to alexh on the MediaSmart forums:
I’ve fixed it.
I had already followed the error log paper trail using the Start->Control Panel->Administrative Tools->Event Viewer tool which showed problems with a file on D:
Turns out that all the files in the folder : D:/folders/{00008086-058D-4C89-AB57-A7F909A47AB4} had been corrupted. The error "Device not connected" is a crap error message which actually means "invalid file handle error" caused by corrupted files / filesystem.
I removed the files in this folder then followed Method 5 of http://support.microsoft.com/kb/946339 "Backup Database Repair" and it replaced D:/folders/{00008086-058D-4C89-AB57-A7F909A47AB4}/Commit.dat and everything came back to life.
However, don’t do what I did and delete all the files – this will remove all of your backups. Just rename commit.dat and then run database repair.
On the one hand, I’m stoked to have the backup service back, but on the other sad that so many backups are toast. Sigh.
Almost a year after I wrote this post promising to keep WCF Chat updated, I’m living up to that promise and updating my WCF Chat application over on Codeplex. The original release on Codeplex is actually just a zip file with the project in it. All things considered it was a knee-jerk posting in the mist of the openFF effort to clone Friendfeed. Of course, the original, actual reason why I posted it is lost to history. And in the middle of all that hoohah I never wrote an introduction to and an explanation of the codebase.
The WCF Chat application was actually a class assignment for a class that included, among other things, WCF, REST and TCP. Its actually interesting to see how that class has changed since I took it three years ago. This year, for example, its including MVC, but I digress. The fact is that my submission did go above and beyond the requirements. And the reason for that is that once I wrote the basic logic, the more complicated stuff was easy. In other words: given enough layers of abstractions, anything is easy.
Having dusted off and worked with the code for a few hours, its rather amazing how easy a chat application is. Now, that statement should be taken in the context of the fact that WCF is doing most of the heavy lifting. So getting the client to ask for data is a relatively trivial task. The tricky bit is the need for a callback.
In this case, I use callbacks for Direct Messages and File transfers. Now, you are probably wonder why I went through the trouble given that the sensible option is simply to poll a server. And it is a sensible option. Tweetdeck, Seesmic and other twitter clients all use polling. Basically, it was in the requirements that there should be two way communication. There are a number of way sto implement this. One could, for example, have a WCF service on the client that the server can call back to. This did occur to me, but its a complex and heavy handed approach, not to mention a resource intensive one. WCF always gives me headaches and so I was only going to do one service. So I wrote a TCP listener that received pings from the server on a particular port.
Thats one peculiarity about this app. The other is the way the server is actually written. We have the WCF service implementation and we have a second server class that the WCF service calls. There is a division of responsibility between the two. The service is always responsible for getting the data ready for transmission and the server does the actual application logic.
The client is fairly straightforward. It uses the Kryton Library from the Component Factory. Its a great UI library that I use anytime I have to write a Windows forms UI. The actual UI code is rather like the Leaning Tower of Pisa – its damn fragile. Basically because it relies on the component designer logic for the way controls are layered. So I haven’t touched it at all. In fact, I haven’t needed to. More on this later.
When you are looking at the client code, you’ll realise that for each type of message control, there is a message type base control. The reason for this is that I foolishly (and successfully) tried to use generic controls. In the current implementation, there is actually precious little code in the MessageBase control. The reason for this is mainly historical. There was originally a lot of code in there, mainly event code. In testing, I discovered that those events weren’t actually firing for reasons beyond understanding. So they were moved from the inherited class to the inheriting class. This is the generic control.
There are message type base controls that inherit from the MessageBase control, and pass in the type (Post, DM, File). This control is in turn inherited by the actual Message, DM or File control. The reason for this long inheritance tree is that the designer will not display generic controls. Rather, that was the case. I’ve yet to actually try it with Visual Studio 2010 Designer. As I said, I haven’t changed the client UI code and architecture at all.
The client has a background thread that runs a TCP Listener to listen for call backs from the server. Its on a background thread so that it does not block the UI thread. I used a background worker for this rather than the newer Task functionality built into .Net 4 that we have today.
Basically, every one sees all the public messages on a given server. There is no mechanism to follow specific people or ever to filter the stream by those usernames. Archaic, I know, But I’m writing my chat application, not Twitter.
There are Direct Messages that can be directed to a specific user. Because the server issues callbacks for DM’s, they appear almost instantly in the users stream.
You can send files to specific users as well. These files are stored on the server when you sent them. The server will issue a call back to the user and the file will be sent to them when the client responds to that callback. You can also forward a file you have received to another user. Files are private only by implication. They are able to be accessed by whoever is informed of the files existence.
All of the above messages are persisted on the server. However, forwarding messages is not persisted in any shape or form.
Also, you can set status. This status is visible only when you are logged in. In fact, your username is only visible to others when you are logged in.
It should be noted that you have to use the Server Options panel to add and remove users.
Todays changes basically upgrade everything to .Net 4 and make sure its compatible. Todays release does not take advantage of anything new other than some additional LINQ and extension methods. Taking advantage of the new stuff will require a careful think of how and where to use them. I’m not quite willing to sacrifice a working build for new code patterns that do the exact same thing.
The original server was actually just a console application. I took that original code and ported it to a Windows Service. There were trivial logic changes made at most. The UI ( i.e the Options form) that was part of that console application has been moved into its own project.
I also ported the server code to a Windows Azure web role. And let me tell you something- it was even easier that I had anticipated. The XML file and the collections I stored the streams in are replaced with Windows Azure Tables for Users, Streams, DMS and Files. The files themselves are written to Windows Azure Blobs rather than being written out to disk.
The web role as written is actually single instance. The reason is that the collection that stores the active users (i.e. what users are active right now) is still a collection. I haven’t moved it moved it over to windows azure tables yet. You could fire up more than one instance of this role, but all of them would have a different list of active users. And because Windows Azure helpfully provides you with a load balancer, there’s no guaranteeing which instance is going to respond to the client. There is a reason why i haven’t move that collection over to Windows Azure Tables. Basically, I’m not happy with it. If Azure had some sort of caching tier, using Velocity or something so i could instantiate a collection of objects to the cache and have all instances share that collection. The Windows Azure table would be changing from minute to minute with Additions, Edits and Deletions and I don’t think Windows Azure Tables would keep up. I’m interested to now what you think of this.
I also added an Options application to talk to the Windows Azure Web Role, and I wrote a WCF web service in webrole to support this application.
The client is essentially the same as it has always been. There is the addition of a domain when you are logging in – this could be for either cloud or service based server implementations. Since there is no default domain, the client needs one when you are logging in. The client will ask for one when logging in. once you have provided one, you’ll have to restart the application.
There are installers for all the applications except for the Cloud project. The service installer will install both the service and the Options application.
Bear in mind that for the Options Applications, there is no authentication and authorisation. If you run the app on a server with the ChatServer installed, or you point the CloudOptions app at the appropriate server, you are in control. This is a concern to me and will be fixed in a future release.
I was tempted to write a HTTP POST server for all this. MVC makes it so easy to implement. There would be plenty of XML flying back and forth. Some of the WCF operations would require some high-wire gymnastics to implement as HTTP POST, but its possible. I might to this.
The one thing that I didn’t update was the version of the Kryton UI library I use. I’d very much like to use the latest version to write a new UI from scratch. Again its a possibility.
The fact is that once you start thinking of implementing following a la twitter, your database schema suddenly looks much more complicated. And since I’m not writing Twitter, I’ll pass.
If you have any suggestions on future changes, holler.
Bear in mind that for the Options Applications, there is no authentication and authorisation. If you run the app on a server with the ChatServer installed, or you point the CloudOptions app at the appropriate server, you are in control. This is a concern to me and will be fixed in a future release.
Also, bear in mind that this is marked Alpha for a reason. If it eats your homework and scares your dog, its not my fault – I’m just some guy that writes code.
Finally, this code all works IN THEORY. I’ll be testing all these pieces throughly in the coming weeks.
You can get it off Codeplex. The source code for all the above mentioned components is checked into SVN source control.
For this 1.1 Alpha release, you’ll find each setup files for each component in a separate downloadable zip file. The CloudServer code is included as is, since no setup files are possible for Cloud projects.
Those of you wondering where the Feedreader screencasts have gone should not be alarmed. I’m definitely going to be doing more of them. These past few weeks have been rather busy and every time i think i’ve a spot of free time to get the screencasts done, something comes up.
At least not in the next episode or two, but certainly when we put finishing touches, jQuery is going to play a massive role in what our UI does. Basically, theres no way around it. So I’ve been looking at jQuery and playing around with it some in preparation for what we’ll be doing later. if your wondering how i managed to escape jQuery for so long the answer is simple: I’m not a web developer. I’m a Computer Science graduate.
I’ve tried to keep the blog regular, with at the very lest one new post a week, and I usually aim for more.
Now, to the real reason I’m writing this post.
I’m off on holiday tomorrow morning (6:30am to be precise – its what you get when you fly no-frills budget airlines like Ryanair. On second thoughts, it might just be the luck of the Irish too*).
I’ve long concluded that the International data plan from O2 is only worth it if you fly overseas more than once a year – and I only fly overseas once a year. So I’ll be doing free wifi-hotspot tourism of the finest kind. However blog posts may be sparse.
So, see you in a few weeks.
*Ryanair is Irish, hence the joke
PS – Considered a Kindle for this holiday. Nice cheap, wouldn’t add much to hand luggage. Looked at an iPad. Nice, expensive wouldn’t add much to hand luggage. Considering I’m aiming to get iPad v2 next year, the money was better spent buying actual books.
PPS Also, First holiday for my iPhone 4. I expect to get very familiar with the iMovie app.
PPPS All of the above assumes iIactually catch my flight. Look at the snow:
Scott Guthrie tweeted a link to an article by Scott Mitchell. In it Scott wrote a handy news ticker in Asp.Net . And he wrote it in VB. I recommend going to read it before doing anything else.
It is a handy little example and a very good demonstration of jQuery in action. I actually first thought of using it in The Feedreader. Of course if I wanted to do that I’d have to re-write it as an MVC application rather than an ASP.Net website.
This is a nice academic exercise on moving from ASP.Met to MVC.
So lets get cracking.
So. We begin by creating an empty MVC2 project.
Actually, we began when we read Scott article. Its important to understand what Scotts trying toacomplish and how Scotts code works, before we shamelessly copy it.
The first thing you are going to want to do is make sure that Scotts’ ticker.js and jquery-1.4.4.min.js are in your MVC Scripts folder and included in the project. Also, you’ll want to copy Scott’s css files across. I put them in a folder called Styles and made sure it was included in the project.
Now, we need a Masterpage before we can create any Views. So add one in Views/Shared. We are shamelessly copying Scotts example in every detail. So go ahead and copy the markup in Scotts example and paste it into the your masterpage. You’ll want to change the script and css paths accordingly.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Untitled Page</title>
<script type="text/javascript" src="../../Scripts/jquery-1.4.4.min.js"></script>
<script type="text/javascript" src="../../Scripts/ticker.js"></script>
<asp:ContentPlaceHolder id="head" runat="server">
</asp:ContentPlaceHolder>
<link href="../../Styles/sinorcaish-screen.css" rel="stylesheet" type="text/css" />
<link href="../../Styles/CustomStyles.css" rel="stylesheet" type="text/css" />
<link href="../../Styles/NewsTicker.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<!-- ======== Header ======== -->
<div id="header">
<div class="left">
News Ticker Demo
</div>
<div class="right">
<%=DateTime.Now.ToShortDateString()%>
</div>
<div class="subheader">
<em>News me!</em>
</div>
</div>
<!-- ======== Left Sidebar ======== -->
<div id="sidebar">
<div>
<ul>
<li><%: Html.ActionLink("Simple Ticker Demo", "Simple","Home")%></li>
<li><%: Html.ActionLink("Dynamic Ticker Demo", "Dynamic","Home")%></li>
</ul>
</div>
</div>
<!-- ======== Main Content ======== -->
<div id="main">
<asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
<!-- ======== Footer ======== -->
<div id="footer">
ASP.NET application designed by <a href="http://www.4guysfromrolla.com/ScottMitchell.shtml">Scott Mitchell</a>.
Website design by <a href="mailto:J.Zaitseff@zap.org.au">John Zaitseff</a>, and available
at <a href="http://www.opendesigns.org/preview/?template=1700">OpenDesigns.org</a>.
</div>
</form>
</body>
</html>
Remember to change the links in the sidebar to ActionLinks.
The next thing we need to do is to write a Controller. Typically the first controller in any MVC application is the home controller.
So go ahead and create one, adding three ActionResult methods: Index, Simple and Dynamic.
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
return View();
}
public ActionResult Simple()
{
return View();
}
public ActionResult Dynamic()
{
return View();
}
}
At this point, create a View for Index and copy the HTML from Default.aspx and stick it in the content control thats been created in the view.
Then, add an empty view for the Simple controller. Since this is straightforward HTML, we simply copy the contents of both ContentPlaceHolders in Simple.aspx into the two that have been created for us in the view
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<h2>Simple News Ticker Demo</h2>
<p>
This demo shows two simple news tickers. Each news ticker has the same hard-coded news items. The
first one shows only the body of each news item, one at a time; the second one shows the headline,
body, and published date of each news item and shows three at a time.
</p>
<h3>One Row News Ticker</h3>
<div class="ticker stretched">
<ul id="latestNews1">
<li>
<div class="body">Politician Joe Smith has assembled a news conference for this afternoon to apologize for some
indiscretion he had. This is Mr. Smith's third such "apology press conference" this year.</div>
</li>
<li>
<div class="body">Did you know that you can play the fun (and addictive!) board game
Axis & Allies online? Head on over to <a target="_blank" href="http://gamesbyemail.com/Games/WW2">http://gamesbyemail.com/Games/WW2</a>
and give it a whirl!</div>
</li>
<li>
<div class="body">A recent study by some doctors somewhere showed a strong correlation between unhealthy eating
and unheathly people. More studies are to be performed to verify these findings.</div>
</li>
<li>
<div class="body">This just in - ASP.NET is awesome! jQuery is not so bad, either. In fact, most technologies are pretty darn
cool. For more information, see <a href="http://www.4guysfromrolla.com/" target="_blank">4GuysFromRolla.com</a>.</div>
</li>
<li>
<div class="body">Last night the local sports team won a convincing victory over their hated rivals. After the game there was much
jubilation.</div>
</li>
<li>
<div class="body">Visit my blog. Please. You can find it at <a href="http://scottonwriting.net/sowblog/">ScottOnWriting.NET</a>.</div>
</li>
</ul>
</div>
<h3>Three Rows News Ticker</h3>
<div class="ticker threeRows medium">
<ul id="latestNews3">
<li>
<div class="header">Politician schedules news conference</div>
<div class="body">Politician Joe Smith has assembled a news conference for this afternoon to apologize for some
indiscretion he had. This is Mr. Smith's third such "apology press conference" this year.</div>
<div class="footer">Published @ 8:30 AM</div>
</li>
<li>
<div class="header">Play Axis & Allies Online!</div>
<div class="body">Did you know that you can play the fun (and addictive!) board game
Axis & Allies online? Head on over to <a target="_blank" href="http://gamesbyemail.com/Games/WW2">http://gamesbyemail.com/Games/WW2</a>
and give it a whirl!</div>
<div class="footer">Published @ 8:38 AM</div>
</li>
<li>
<div class="header">Study links unhealthy food to unhealthy people</div>
<div class="body">A recent study by some doctors somewhere showed a strong correlation between unhealthy eating
and unheathy people. More studies are to be performed to verify these findings.</div>
<div class="footer">Published @ 9:00 AM</div>
</li>
<li>
<div class="header">ASP.NET is awesome!</div>
<div class="body">This just in - ASP.NET is awesome! jQuery is not so bad, either. In fact, most technologies are pretty darn
cool. For more information, see <a href="http://www.4guysfromrolla.com/" target="_blank">4GuysFromRolla.com</a>.</div>
<div class="footer">Published @ 9:09 AM</div>
</li>
<li>
<div class="header">Local sports team wins</div>
<div class="body">Last night the local sports team won a convincing victory over their hated rivals. After the game there was much
jubilation.</div>
<div class="footer">Published @ 9:35 AM</div>
</li>
<li>
<div class="header">Read my blog</div>
<div class="body">Please. You can find it at <a href="http://scottonwriting.net/sowblog/">ScottOnWriting.NET</a>.</div>
<div class="footer">Published @ 10:30 AM</div>
</li>
</ul>
</div>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
<script type="text/javascript">
$(document).ready(function () {
startTicker('#latestNews1', 1, 5000);
startTicker('#latestNews3', 3, 5000);
});
</script>
</asp:Content>
Note the javascript in the “head” ContentPlaceHolder. This fires as soon as the page as finished rendering. Scott has more details about it in his article.
Now, this is the hard part.
Scott Mitchells’ example used an ASP ListView control. If you’re writing ASP.Net code a listview is the easiest way to accomplish what we’re trying to do. You’ll notice as well that Scott passes the contents of SyndicationFeed.Items directly to the databound control. Now there is most probably a way of using Scott’s code directly in an MVC view. However, for the purposes of convenience we’ll dispense with the ListView and iterate over items ourselves.
There is also the issue of the Formatting of the items. You’ll notice that the ItemTemplate in Scotts’ code calls FormatSummary and FormatPubDate from the HTML. Because of the separation between code and HTML in MVC we can’t do that.
The solution to both of these “problems” is to do things ourselves. The M in MVC stands for model. So we need a model before we go any further. The two pieces of data we need are contained in the Summary and the PublishDate fields of the SyndicationItems. So this is what our model looks like:
public class Model
{
public String Title { get; set; }
public string Date { get; set; }
}
FormatSummary and Format PubDate, obviously need to be part of the HomeController class:
public static string FormatSummary(string summary){
string header = "ScottOnWriting: ";
//Remove the leading "ScottOnWriting: "
if (summary.StartsWith(header)){
return summary.Substring(header.Length);
}
return summary;
}
public static string FormatPubDate(DateTimeOffset pubDate)
{
return pubDate.ToString("h:mm, MMM d");
}
Now that the groundwork has been laid, we can write our actual HTML view. First we need to add our javascript function:
<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
<script type="text/javascript">
$(document).ready(function () {
startTicker('#tweets', 2, 4500);
});
</script>
</asp:Content>
This javascript function will do nothing unless ticker.js exists in your scripts folder. It will end up in the page header and will be executed as soon as the document has finished rendering. Also note that we are passing 2 in here. We could pass in any number we wanted. Scott explains more about this in his article.
Now, the fact is that the original implementation using a ListView basically iterated over all the objects in the datasource and output a select piece of HTML for each item in that collection. So, we’ll do the same.
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<h2>Dynamic News Ticker Demo</h2>
<p>
This demo shows a ticker whose contents are populated dynamically. This particular example pulls the most recent tweets from
<a href="http://twitter.com/ScottOnWriting">my Twitter account</a> and displays them in a ticker, showing two entries at a time.
</p>
<h3>@ScottOnWriting's Latest Tweets</h3>
<div class="ticker twoRows medium">
<ul id="tweets">
<%foreach (var item in this.Model)
{ %>
<li>
<div class="header" style="font-weight: normal">
<%= item.Title.ToString()%>
</div>
<div class="footer">Tweeted @ <%: item.Date.ToString()%></div>
</li>
<%} %>
</ul>
</div>
</asp:Content>
Note the careful placement of our Foreach statement. Our list item (<li/>) and the HTML with in it will be repeated on each pass over the loop body. Also, note how we are using var item in this.Model. Our View knows exactly what datatype has been passed to it. In fact, our view is actually View<Model.Model>. Yes, its a generic. And we are using var here to avoid typing Model.Model over and over again.
So, in a nutshell, the above code does the exact same thing as a ListView Control.
Hit run and it should be working.
Playing Mario using Kinect– Awesome!!
Thanks to PopSci – more info here.
It can’t be long till Microsoft release a proper SDK can it?
Ever since Microsoft announced it was removing Drive Extender from the next version of Windows Home Server, there has been an echo chamber effect with everyone saying the same thing : we don’t like it, we want it back, WHS is dead without it.
The same goes for what Microsoft should do now: port DE v1 into Vail, re-ad DE v2 to Vail only.
So I wont go and repeat all that .
The fact of the matter that WHS does not make nearly enough money to merit the full attention its DE woes deserve (The disKeeper blog makes this point as well). I’m sure all manner of problems could have been solved were the full might of the Developer Division to decent on the WHS team like a deus ex machina … Ok, maybe I’m being a little dramatic here. Nonetheless, my point stands – all problems can be solved with adequate resources – read money-in fact its practically the American way (I’m looking at you Bernanke).
The reason why Xbox (a big leap but bear with me) has flourished so much is because the team understands consumers. They understand what we, the consumer, want from them, the team. Xbox went from being a niche to a multi billion dollar arm of Microsoft. Helped in no small part by the Halo franchise (again – understanding of the consumer wants and needs at work).
Windows Home Server is in a similar place at the moment. WHS v1 was perfect. perfect in a way that’s difficult to describe. It was perfect enough for me to go out on a limb and buy a Dell server to run beta 1 on. The kind of perfect where you feel it in your bones – “this is it”. (PS Microsoft: try get a commission off Dell for that if you can)
The fact is that WHS solved a number of difficulties at a stroke: back up and redundant protection against hard drive failure. As a result I no longer have nightmares (well i do, but about fire burning down the house rather than hard drives and computers biting the dust, but thats another story).
The peace of mind that comes along with this is simply priceless. The fact of the matter is that there is no other way of getting that peace of mind with as minimal effort as setting up a WHS server. I’m not Microsoft – I don’t have the hardware and legions of RAID experts to call on. So WHS is the only way (yes there are alternatives, but I’m talking about the solution of minimal effort here).
So, Microsoft. Please. Give us our Drive Extender back. Whether you decide to use v1 or v2. Whether Aurora and Beckenridge have it or not. Add it back to Vail. You will have the appreciation and loyalty of a grateful bunch of people. This is an opportunity to pour fire over burning bridges (and maybe rebuild them with stone).
In the meanwhile, WHS users have started a petition. Vote here (half tempted to call this Organising For Drive Extender – a pun on Obama’s organising for America).
I think I’ll be buying me a Kinect one of these days….
Amazing eh!!
I’m just reading ScottGu’s post on the MVC 3 release candidate.
What got me really thinking was the output cache attribute:
![]()
Scott explains:
Notice how the DailySpecials method above has an [OutputCache] attribute on it. This indicates that the partial content rendered by it should be cached (for 3600 seconds/1 hour). We are also indicating that the cached content should automatically vary based on the category parameter.
If we have 10 categories of products, our DailySpecials method will end up caching 10 different lists of specials – and the appropriate specials list (computers or diapers) will be output depending upon what product category the user is browsing in. Importantly: no database access or processing logic will happen if the partial content is served out of the output cache – which will reduce the load on our server and speed up the response time.
This new mechanism provides a pretty clean and easy way to add partial-page output caching to your applications.
So, with my Windows Azure Feedreader in mind, my note to self is as follows:
In a couple of weeks, when we get to the shared items Rss feed, we can use this code. We vary by user id rather than by category in the example above.
I’m actually quite relived, as I was wondering how we’d do the shared items Rss feed. These actions would, arguably, be highly trafficked and reading directly from the blobs (which was my original plan) would be too bandwidth intensive. Problem solved.
I’m very excited about MVC 3 as a whole, but when i see the direct application of features, I get even more excited.
In fact, when Razor first came out, I really was going to use it for the Feedreader instead.
Update:I wrote this post using the WordPress iPhone app. So just got home and corrected some formatting
Today I read (see here) that the successful VLC iPhone app might be pulled from the App store.
The reasoning behind this, apparently is that the App Store Terms Of Service breach the GPL in that all apps are sold with DRM.
First of all, this is lunacy. After 3 years trying to get it in the store, pulling it would cause an uproar. After Apples’ successful weathering of the no flash controversy, that uproar is not going to get apple to remove DRM.
Second, VLC is open source. So, open source the app, or release a DRM free version on the jailbreak app stores. Problems solved.
So my advice to the VLC team is to grin it and bear it. Nobody said the world was perfect.
Sticking to the letter of the GPL may be wonderful for the open source diehards, but the rest of us seriously couldn’t care less.
You must be logged in to post a comment.