Alex blogged the web.config entries for enabling Velocity CTP3 in web.config for ASP.NET Session State.
http://tinyurl.com/velaspnetconfig
Since I'm doing my talk on Velocity this week I took the time to update my Quick Reference Sheet for PowerShell commands.
Download it here.
Essentially the only change that I could tell is the -Notifications flag was added. You use this parameter to enable the cache notifications feature when creating a new cache, or updating an existing cache.
For a more complete difference between CTP2 and CTP3, read this blog post.
In the Javascript world, the hot topic these days seems to be jQuery. Microsoft is beginning to see its value, and DotNetNuke is baking it in in their 5.0+ release. For me, it just makes sense to add it to my portfolio.
When I take the time to learn any sort of new technology I make an attempt to take the project and turn it into something useable. In the case of jQuery I decided to create a set of ASP.NET Friendly controls which wrap up the jQuery UI Interactions and Widgets.
Enter jQueryDotNet. (Download)
Its a little project I did, mostly over the past weekend. Each of these controls include all options and client side events for each Widget and Interaction and even an Animation and Effect implementation.
Interactions (ASP.NET Extender Controls)
Draggable
(done) Droppable
(done) Resizable
(done) Selectable
(done) Sortable
(done) Dialog
(done) Full Ajax support on Client and Server (using JSON Serialization)
(done) Widgets (ASP.NET Server Controls)
Accordion
(done) Datepicker
(done) Progressbar
(done) Slider
(done) Tabs
(done) Effects (ASP.NET Extender Controls)
Effects (done)
Animation (done)
Its very difficult to actually get the whole experience across in simple screen shots, but if your the type that needs them, here is a flickr set.
Sample Code:
First thing is first, you need to add a ScriptManager control to the page:
<cc2:ScriptManager EnableNoConflict="true" ID="ScriptManager1" runat="server">
</cc2:ScriptManager>
Notice the difference between an actual Server Side Control like the Accordion Control vs an Extender Control like the Resizable Extender. Extender controls are designed to be added to an existing page and extend a specific control client side UI – like making a panel resizable!
Here is just a few examples of what is available in the jQueryDotNet project.
Accordion Control:
<cc1:AccordianControl Collapsible="true" Event="click"
OnClientTabChange="alert(ui.newHeader.context.innerText)"
ID="JQueryPanel1" runat="server" Accordian="true">
<cc1:AccordianPanel ID="Accordian1" runat="server" Text="Accordian Panel 1">
This is accordian panel 1
</cc1:AccordianPanel>
<cc1:AccordianPanel ID="Accordian2" runat="server" Text="Accordian Panel 2">
This is accordian panel 2
</cc1:AccordianPanel>
<cc1:AccordianPanel ID="Accordian3" runat="server" Text="Accordian Panel 3">
This is accordian panel 3
</cc1:AccordianPanel>
<cc1:AccordianPanel ID="Accordian4" runat="server" Text="Accordian Panel 4">
This is accordian panel 4
</cc1:AccordianPanel>
</cc1:AccordianControl>
Screen Shot:
Ajax Support
<script type="text/javascript">
var result = '';
function AjaxCallBack(ServerResult, Status) {
debugger;
if(Status == "success") {
var result = eval('(' + ServerResult + ')');;
result = ServerResult;
}
}
function GatherSomeData() {
debugger;
return '{"SharedString":"Hello World","SharedDouble":6.0,"SharedInt":5,"Children":[{"SharedChildString":"Im a child from the client!!"}]}';
}
</script>
<asp:Button runat="server" ID="TriggerButton" Text="Click Me" OnClientClick="return false;" />
<asp:Label runat="server" ID="ResultLabel" Text="Results"></asp:Label>
<cc2:AjaxExtender runat="server" ID="AjaxExtender1"
MethodName="ServerMethod" Callback="AjaxCallBack" TriggerControl="TriggerButton"
OnClientBeforeAjax="GatherSomeData();"
></cc2:AjaxExtender>
Code Behind:
public partial class AjaxArrayJson : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
public static string ServerMethod(HttpContext context, string UniqueID, string Data)
{
if (Data == "")
{
SharedData sd = new SharedData();
sd.SharedDouble = 6;
sd.SharedInt = 5;
sd.SharedString = "Hello World";
sd.Children = new List<SharedChild>();
SharedChild c1 = new SharedChild();
c1.SharedChildString = "Im a child";
sd.Children.Add(c1);
return Newtonsoft.Json.JsonConvert.SerializeObject(sd);
}
else
{
SharedData data = (Newtonsoft.Json.JsonConvert.DeserializeObject(Data, typeof (SharedData)) as SharedData);
if (data != null)
return "{\"result\":\"GOOD\"}";
else
return "{\"result\":\"BAD\"}";
}
return "";
}
}
public class SharedData
{
public string SharedString { get; set; }
public double SharedDouble { get; set; }
public int SharedInt { get; set; }
public System.Collections.Generic.List<SharedChild> Children { get; set; }
}
public class SharedChild
{
public string SharedChildString { get; set; }
}
Animations:
<asp:Panel runat="server" ID="Panel1" BorderWidth="1">
this is the content<br />
this is the content<br />
this is the content<br />
</asp:Panel>
<br /><br /><br />
<asp:Panel runat="server" ID="Panel2" BorderWidth="1">
<div id="AniDiv" runat="server">
Click me
</div>
</asp:Panel>
<cc2:Animate runat="server" ID="Animate1"
TriggerControl="Panel1" AssociatedControl="Panel2"
To="backgroundColor: '#fff', color: '#000', width: 240"
From="backgroundColor: '#aa0000', color: '#fff', width: 500"
/>
DatePicker:
<cc1:DatePicker
OnClientBeforeShow="$(this).fadeOut().fadeIn();"
OnClientOnSelect="alert(dateText);"
ID="DatePicker1" runat="server"></cc1:DatePicker>
Screenshot:
Resizable Tab Control:
<cc1:TabControl
Disabled="3"
Selected="2"
Collapsible="true"
Fx="{ opacity: 'toggle' }"
OnClientTabsSelect="alert(ui.tab.outerText);"
ID="TabControl1" runat="server">
<cc1:Tab ID="Tab1" runat="server" Text="TAB A" TabName="TABA"></cc1:Tab>
<cc1:Tab ID="Tab2" runat="server" Text="TAB B" TabName="TABB"></cc1:Tab>
<cc1:Tab ID="Tab3" runat="server" Text="TAB C" TabName="TABC"></cc1:Tab>
<cc1:Tab ID="Tab4" runat="server" Text="TAB D" TabName="TABD"></cc1:Tab>
<cc1:Tab ID="Tab5" runat="server" Text="TAB E" TabName="TABE"></cc1:Tab>
<cc1:TabPage ID="TabPage1" TabName="TABA" runat="server">
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" />
</cc1:TabPage>
<cc1:TabPage ID="TabPage2" TabName="TABB" runat="server">
<asp:DropDownList ID="DropDownList1" runat="server"></asp:DropDownList>
<asp:HyperLink ID="HyperLink1" runat="server">HyperLink</asp:HyperLink>
</cc1:TabPage>
<cc1:TabPage ID="TabPage3" TabName="TABC" runat="server">
C
</cc1:TabPage>
<cc1:TabPage ID="TabPage4" TabName="TABD" runat="server">
D </cc1:TabPage>
<cc1:TabPage ID="TabPage5" TabName="TABE" runat="server">
E </cc1:TabPage>
</cc1:TabControl>
<cc2:Resizeable ID="Resizeable1" runat="server" AssociatedControl="TabControl1" />
Screen Shot:
Lastly, please do NOT post feedback/suggestions/bugs/questions/etc. to my blog. I will NOT answer them. Use the facilities supplied on the CodePlex site itself.
So here is a little update on my previous post regarding Microsoft’s Mesh Product. It seems that at some point during the uninstall of the product from my desktop it created a “%Destkop%\Live Mesh\Conflicts[0000]” folder and inside includes ALL of the documents (and all of the versions of each document) that Mesh decided to clobber.
Now it really has me thinking. Did the Mesh tool actually keep track of these differences? Why didn't it warn me about conflicts during day to day operation? I don't recall any place in any Mesh related UI which allowed me to view and resolve these issues.
I think for now, I’m still going to stick with the USB Pen drive + Good Sync.
Current thought process
I have been spending some time with the Velocity and ASP.NET 4.0 Cache Extensibility teams at Microsoft working with them to formalize some up and coming releases. One common thread that I just can't help but notice is the fact that the average developer simply should NOT care about the specifics around Caching. For example, when/how to lock, dependencies, static's, how to create a cache/regions, get a cache, expire vs. eviction, etc..
They should only care about this "Cache" thing, that I can Get and Put data in and out of.
Types of Data
As you begin a deep dive into Caching you soon see that there are a few ways to slice and dice the caching world. The most simplistic method is to do division by the type of data you are working with. Here is a snippet from the Microsoft Velocity Documentation regarding types of data.
| Understanding the various types of data helps define the degrees of caching that are possible using "Velocity." As seen in the following table, there are three types of data that are appropriate for distributed caching: reference, activity, and resource. (Source) | Data Type | Access Pattern | | Reference | Shared read | | Activity | Exclusive write | | Resource | Shared, concurrently read and written into, accessed by a large number of transactions | |
For example:
Reference data could be Amazon's Book Catalog.
Activity data could be the User's Shopping Cart - secure, tied to that user's session
Resource data could be the Stock available for each Catalog item
Design Patterns
From an API perspective we should consider actual developer usage based on common design patterns. I would love to see a ReferenceDataCache, ActivityCache and a ResourceCache in the API. Each specific type of Cache wrapper should just take care of the internal details for me and guide me on usage. The Architectural roles in the organization can config/tweak specific cache details based on these common patterns and tied to the specific needs.
For example I want to create a AmazonBookCache which is a ReferenceCache and never worry about locking items (since its shared read, there is no need to lock anything). I also want it super-optimized for reads across the cache cluster.
I could create a ShoppingCartCache which is a ActivityCache<T>. In this type of cache, all of the methods would require the additional parameter (T) to indicate the specific User key - long, guid, or whatever your application uses to represent that specific user the activity is based on. Locking would be important so expose the relevant concurrency based Get/Put methods only – that is, remove Put() methods that do not include version information parameters.
Closing Thoughts
I understand the basic need of getting a core API working correctly and obviously it would be in Microsoft’s best interest in getting that done as soon as possible. With that said, for this API to be of any use, there is a need for a consistent set of wrappers based on common patterns which we all can rely on.
Caching is one of those seemingly easy things to put in place but in reality if it is not done correctly could have very drastic –negative- implications on the application.
Via Bertrand Le Roy
I mostly just wanted to bookmark/echo a post from Bertrand here.
Internet Explorer 8 is a unique release in the history of Internet Explorer in more than one way, but the decision to make standards mode the default means that authors of existing sites are impacted by it, if only to set the compatibility mode to IE7…
Read more and download links are on Bertrand’s Post here.
I have been using Live Mesh ever since it’s initial release, even on my WiMo device. Today I opened up a Word Document – that I update daily – and just noticed that it has been reverted to a copy that is about 1 week old. This is not the first time that this has happened. And of course I was using Mesh as my only backup.
It seems that Mesh cant handle a simple thing like versioning of documents correctly. Unacceptable.
Its time to revert back to using my USB Pen drive for shared documents, and GoodSync to back it up.
As you can suspect this is very disappointing for me. I think for my Music I will leave them in Mesh since that really wont matter.
Either way, it would seem that Microsoft has a bit of work to do in order to aggregate all of their online/cloud services together under one bucket (Azure?).
- MyPhone – which seemingly is not integrated with the standard live services. Why one would want two separate calendars for the same data is beyond me.
- Mesh
- SkyDrive
- Live (mail/calendar/etc.)
Live.Mesh.UnInstall();
As per request from Steve Ballmer, to all MVP’s for the past two years, I have been attempting to switch my life over to Microsoft’s Live Search (and services). The breadth and depth of what Live has to offer is rapidly increasing and I'm really starting to recognize the value in the vision coming out of the Live team. Take for example their mapping service - IMHO Live.com maps are superior in usability and quality over any other free Map provider.
This post is not intended to get you to switch, but more to voice my opinion about the biggest lacking feature to come from Live Search.... Proximity Searching
I can honestly say that 99% of the time when searching for a person, business, etc.. I leverage Google's "near:XXX" search syntax. This would probably constitute over 80% of my non-technical related queries - a significant amount per day.
For example:
Google:
Restaurant near:v5l 4h4 (lists all restaurants, near my house - even a map)
vs
Live:
Restaurant loc:v5l 4h4 (Empty search results!)
After consulting the search.live.com documentation I find:
|
loc: or location: |
Returns webpages from a specific country or region. Specify the country or region code directly after the loc: keyword. To focus on two or more languages, use a logical OR to group the languages. |
To see webpages about sculpture from the U.S. or Great Britain, type sculpture (loc:US OR loc:GB). For a list of language codes that you can use with Live Search, see Country, region, and language codes. |
As you can quickly determine on your own, having it based at the Country/Region/Language is very inadequate, not to mention having to memorize the specific Country/Region/Language code of the given location you need to search for. Ouch!
So my previous example I would be limited to:
Restaurant loc:CA (lists all restaurants, in Canada)
--Extremely inadequate for any sort of proximity searching that matters.
My hope is that this is on the near-term road map for the team. If so, I would never need to feed the Google marketing engine again (and yes, that IS a good thing!).
This came in last night, as per the -expected Mix09 release-
Appears that a restart is required.
--------------------------------
Microsoft |
| March 19, 2009 5:40:48 PM |
|
Rob Chartier |
Hi Everyone!
Internet Explorer 8 has now been released! To download, please click here.
Before installing, please read the Release Notes and more information about features and developer docs can be found in the IE8 Readiness Toolkit.
IE8 Beta Feedback:
Thank you for all the bug reports you have submitted. All Postponed bugs are now active for consideration in the next version of Internet Explorer. We resolved and closed all other bugs submitted since IE8 Beta 1.
Filing Bugs for IE8 RTW:
We are looking for new IE8 bugs and bugs that have regressed (meaning the bug was previously fixed and now occurs in IE8 RTW). Please only reactivate issues that were resolved as Fixed and reproduce in IE8 RTW. We will automatically resolve any other bug that is reactivated. Please see below for more information on re-activating your bugs.
The Internet Explorer 8 Feedback website on Microsoft Connect will remain open and we will not delete any of your previously submitted bugs.
In the next couple of months, we will introduce a new type of feedback form designed specifically to handle improvements for the next version of Internet Explorer. Please stay tuned for more information.
Please see the Technical Beta homepage on Microsoft Connect for more information.
Best Regards,
The IE Team.
More Posts
Next page »