some .net and personal blah blah blah RSS 2.0
Navigation
Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2012 Anders Madsen
Sign In
# Tuesday, September 16, 2008

Find file by its name:

To quickly find a file by its name in a large Visual Studio solution: Click the find input box in the toolbar or go to it by with Ctrl+D or Ctrl+/ (num slash).

Then type e.g. "of> blah" and all files starting with "blah" in the solution if show in a drop down window.

If the find box in the toolbar is not there, then:

  1. Right click the toolbar and select customize
  2. Select the Edit category.
  3. In the Commands list press the "G" key a few times until "Go To Find Combo" is there.
  4. Drag it to the toolbar.

image 

Find/track current open file:

To find the current open file in the Solution Explorer (Ctrl+Alt+L) you can assign a shortcut-key to View.TrackActivityinSolutionExplorer.

  1. In the menu select Tools->Options...->Environment->Keyboard
  2. Type "tracka" in the "Show commands containing" and make sure View.TrackActivityinSolutionExplorer is selected.
  3. Click the "Press shortcut keys" and press the shortcut you prefer. E.g. Ctrl+F11.
  4. Select Global and hit Assign.

image

This will toggle the tracking on and off. But I prefer just to find it and then keeping it off. To do this you can create a macro (Alt+F11 etc.):

   1: Sub FindInSolution()
   2:     Dim p As [Property]
   3:     p = DTE.Properties("Environment", "ProjectsAndSolution").Item("TrackFileSelectionInExplorer")
   4:     p.Value = 1
   5:     p.Value = 0
   6: End Sub

This will turn the tracking on to find the file and turn the tracking off again. Assign it to the keyboard as described above but find trigger method (in item 2) by typing "FindInSolution" instead.

 
Tuesday, September 16, 2008 11:22:51 PM (Romance Daylight Time, UTC+02:00)  #    Comments [2] -
 
# Saturday, August 30, 2008

google_translateEarlier on I wrote about some web applications that can translate from the Danish language to English.

Since that post, Google has added the Danish language to their translation service:

Again I'm testing the same sentence as on my previous tests:

In Danish: "Jeg hedder Anders. Jeg tester lige de her ting der oversætter."
My translation of above: "My name is Anders. I'm just testing these things that translates."

Google suggests: "I'm Anders. I test here just the thing to translate.".

Although that is not entirely correct - it's still very good, but gramtrans.com actually did a better translation for that particular sentence.

Translating the result back again:

In this test I'm taking the Danish->English result from above and use the same engines to translate it back to Danish again - letting the translate engines eat their own dog food:

Google: "Jeg er Anders. I testen her bare ting at oversætte."
My translation of above: "I am Anders. In test here just thing to translate."

Gramtrans: "Mit navn er Anders. Jeg lige tester disse ting der oversætter."
My translation of above: "My name is Anders. I just test these things that translates."

In this twice translated sentence the Gramtrans translator wins..

About GramTrans: "GramTrans is a cooperation between two small specialized language technology companies, GrammarSoft ApS, based in Denmark, and Kaldera Språkteknologi AS, based in Norway".. That, I guess, explains the superior results (the Norwegian language is very similarly to Danish).

 
Saturday, August 30, 2008 8:07:18 PM (Romance Daylight Time, UTC+02:00)  #    Comments [0] -
 
# Friday, August 22, 2008

Thus IE8 (Internet Explorer) is going to be released in few months (November) I have switched to FF3 (Firefox) as the primary browser. Especially after I found a way to make it look and feel exactly like IE7.

Some time ago I wrote about searching in IE from the address bar - I needed this in Firefox. After a quick research I found that Firefox has this as a built-in functionality! And it's even in a much easier done for the common user. Here is how:

  1. Go to your desired search site e.g. http://www.imdb.com/
  2. Right click the search box to display the context menu and click "Add a Keyword for this Search..."
    Add Search To Firefox - IMDB Context menu
  3. For this IMDB sample I type the "m" as the keyword ("m" for movie") and created a bookmark folder named "Search" just to group them.
    Add Search To Firefox - Bookmark options
  4. Now to use it: Press ALT+D keyboard shortcut key to go to the address bar and type e.g.: "m elephantman".
  5. The keyword kicks in and translate the URL to "http://www.imdb.com/find?s=all&q=elephantman" and the IMDB search results displays.

The advantaged here is: that you can always do quick search using the browsers main selected search engine using CTRL+E keyboard shortcut key (Windows + English), but if you want so search various sites like Wikipedia, IMDB, Youtube etc. it's an overhead selecting the search engine in the search bar, and remember to change it back again..

 
Friday, August 22, 2008 11:01:52 PM (Romance Daylight Time, UTC+02:00)  #    Comments [0] -
 
# Tuesday, July 22, 2008

Or my cat - extra fun if you have a cat knowing that they sometimes gets on your nerves..

'TV Dinner' (youtube link):

'Cat Man Do' (youtube link):

Or 'Let Me In'.. Director Simon Tofield from tandemfilms.com.

 
Tuesday, July 22, 2008 7:05:46 PM (Romance Daylight Time, UTC+02:00)  #    Comments [0] -
 
# Thursday, July 03, 2008

If your a nerd this is cult fun: The Website Is Down. But, only if your a nerd..

 
Thursday, July 03, 2008 4:45:21 PM (Romance Daylight Time, UTC+02:00)  #    Comments [0] -
 
# Sunday, June 29, 2008

DS508I recently got a Synology DS-508 NAS (Network Attached Storage) as a replacement for my older Synology CS-406. I must say that I was overall happy with the CS406, but still, I researched alternatives when I looked for the replacement - but Synology DS-508 was the winner, and so far I'm very happy with it.

In short terms, this is a small box that can be stuffed with 5 hard drives and accessed over the LAN and Internet as a one volume storage server with RAID-5 (all your data is safe even if one disk crashes).

The CS-406 was packed with 4 * 500GB disked which made a 1.5TB storage in RAID-5. The new DS-508 is running with 5 * 1TB - so a total of almost 4TB in RAID-5 creates this monster (in the year of 2008 that is).

First thing I noticed when powering on the DS-508 was the noise level - very low!!.. That wasn't an issue for me since I have placed my servers in the basement, but it's more quite than my laptop on overload. The low-level formatting didn't make a sound, but when it got the the "Creating file system" it was still very subtle but it sounded like a freight-train passing by at a long distance - that's how 5 x 1TB disk sound when they are all writing data.. And it's a sweet sweet sound for a nerd :-)

The greatest benefit about the Synology DS-508 is (from my POV):

  • The performance! It writes with around 30 MB/s, so you will need Gigabit LAN for this unit. The CS-406 is only around 11 MS/s.
  • Up to 5 * 1TB disk (SATA), that's 3.655 GB) in RAID-5 on ONE volume.
  • DS508-AdminHot-swap and easy to install disks - don't have to open the belly of the unit.
  • A very nice AJAX / Web 2.0 interface, but that goes for all of the Synology now - even the DS-207 and my old DS-406 (although I didn't dare updating my old unit).
  • Low noise. I used WD RE2-GP SATA Hard Drive 1TB.
  • Hot swap RAID-5.
  • A lot of features like Apache web-server, Web-Cam support, BitTorrent Downloads, iTunes server etc.
  • It's super easy to add the disk and set it up. The software works!
  • Add USB Disk (or printers) or eSATA and read NTFS (read-only) for format them to EXT3 (Linux file format) and read/write to them.

Under the hood it runs a Linux OS with many features added like slick admin interface, built-in permissions (groups and users) and AD for Windows, FTP Server and Web server (PHP) with MySQL etc. etc.

 
Sunday, June 29, 2008 2:11:49 PM (Romance Daylight Time, UTC+02:00)  #    Comments [4] -
 
# Wednesday, June 18, 2008

Funny and well made!

[link]

 
Wednesday, June 18, 2008 12:52:55 AM (Romance Daylight Time, UTC+02:00)  #    Comments [0] -
 
# Sunday, April 06, 2008

In this post we take a look at how to create an element using JS (JavaScript) and adding it to the body.

A DIV html element will be created and added 4 times, but one of the add are doesn't work since the body is not yet created (see line #23).

js-events 
 

Creating the Element

After the basic HTML stuff the createMyElement function is defined in line #9 and it takes 1 argument/parameter that defines the background-color. Most styles can be accessed through myElement.style.[style name] where the style name is the style with out "-" and then camel cased.

Since we have define a CSS class called "box" for any DIV element, we set this class in line #13. Note that the attribute is not "myElement.class" like the attribute name <div class="box"> but "myElement.className"!

Final resultBefore we set the background color we check (in line #15) that the color is passed to the function (true or not null). In JS all function parameters can be left out or some more added. So call createMyElement(); is as good as createMyElement("#f00", 1, 2, 3);

In line #18 the element is then added to the body. document or window, and therefore also window.document are always exposed to the JS code.

Calling the Function

The first attempt in line #23 will fault since the body is not created yet - and that's why it's wrapped in a try/catch or else the rest of the JavaScript wont run. The browser has gotten to the body of the document yet, so it hasn't parsed that markup yet - and therefore the document hasn't got a BODY element.

But you can call a function before that it's declared!.. That's because the browser will parse/compile each script segment or included JS file in the order that they appear. So if there's to <script> elements, A cannot call a function in B but B can call function in A.

Adding the Events

So we have 3 options for creating the element.

  1. This is the "correct" way of doing it. Add an event using the "addEventListener" function that applies to almost all elements. This is done in line #31-37.
  2. Call the script in or after the BODY element. There are no strict rules that says that the JS has to be inside the HEAD element. See line #54.
  3. Use the "onload" in the BODY tag. See line #49.

For option #1, note here that the addEventListener function doesn't apply to IE. In IE it's sadly called "attachEvent" and the event name has to be prefixed with "on" like "onload" - just as the attribute name on the element.

When using the addEventListener method, the only parameter that is passed is the event object. This object also differs between IE and FF (click the links to see each documentation). That's why the wrapper function is called.

The end result look like the picture on the right. Although in IE7 color order are Red, Green and then Yellow. It's also all the little things that can make cross browser coding go wrong.

This is a part of a work internal self-study course where I'm trying to share some knowledge about html, css and JavaScript. I'm posting tips and tricks here in my blog over the next few weeks.

 
Sunday, April 06, 2008 10:05:32 PM (Romance Daylight Time, UTC+02:00)  #    Comments [0] -
 

In this post I do a rundown of my knowledge or my take to crating OOP like structure in JS (JavaScript). Amongst other - you should read this article (I haven't read it but it looks nice :-)).

JavaScript is not really an OOP (Object-oriented programming) language as you may know it from Java or C# etc. It's not as controlled and hard typed, but you can gain pretty much the same benefits as encapsulated properties in the object, inheritance etc. I wont go into details of the inner workings, just show a few sample that might get you started.

There are many JS libraries out there that makes life easier. One of them is MS Ajax / Microsoft Ajax for ASP.NET or what ever. The MS-AJAX consist of both server- and client site making it easy to make HTML element update them self without reloading the whole page. But it's also a JS client library for making JS programing a bit more easy. Check out the client reference documentation here.

In short, these libraries extends the basic JS objects with new functions and provides new objects.

Let's have a look on how we can extend the basic JavaScript. I will use some simplified versions of the ones that are in the MS AJAX client library - mostly removing the exception handling / valid argument checking.

Extending JavaScript

Let's extend the Array and String objects in to ways:

   1: Array.clear = function Array$clear(array) {
   2:     array.length = 0;
   3: }    
   4:  
   5: String.prototype.startsWith = function String$startsWith(prefix) {
   6:     return (this.substr(0, prefix.length) === prefix);
   7: }

In line #1 the Array.clear function is added to the Array object as what I would like to call: as a "static" method, and in line #5 the String object is extended with an "instance" method.

The difference between these two are, that the array extension are called by Array.clear(myArray) and the string method are called on the initiated object itself as "myString".startsWith(..);

Let have a look on how to use the above.

The Array Extension

   1: // Create an array
   2: var myArray = new Array();
   3: // Create it again (just to show)
   4: myArray = [];
   5:  
   6: // Add a string to the array using index
   7: myArray[myArray.length] = "Hello";
   8: // Add a strings to the array using push
   9: myArray.push("world", "...");
  10:  
  11: // Shows "Hello,world,..."
  12: alert(myArray);
  13:  
  14: Array.clear(myArray);
  15:  
  16: // Shows "" - the array is now blank
  17: alert(myArray); 
  18:  
  19: // Creates the array in one take
  20: myArray = ["Hello", "world", "..."];
  21: // Shows "Hello,world,..."
  22: alert(myArray);

In line #2 the array is created in a normal fashion as known from C# etc. In line #4 the array is recreated to show that instead of writing "var myArray = new Array()" we can just write "var myArray = []".

In line #7 we add an entry to the array by the index number - in this case the length or count of the numbers of entries in the array. This is JS only code, since most languages would yield a past index error here - but JS is "dynamic" (by the good and the evil). Remember that JS array unlike VB (Visual Basic) etc. arrays are 0 based, so myArray[0] = "..." has the length/entry count of 1. The last element of an array or a string is always: myArray[myArray.length - 1].

In line #9 we use a method called push to add one or more object (in this case strings) to the array. It could be myArray.push("one") or myArray.push("one", "two" three") etc.

The alert of myArray in line #12 will automatically combine the array elements into one string separated by ",". This is just to show the result on what we have done until know.

Extension? We are here now: In line #14 we call the Array.clear that calls the our extension function. This function is not an instance function, so we can't call it by using the instance of the array object as in myArray.clear() - it's a class function also called a static function. A function, method, subroutine, procedure, or subprogram - all the same.

I'll let the rest of the code speak for it self by referring to the Array documentation.

The String Extension

The string extension is a instance extension done using the "prototype".

   1: var myString = "Hello world!";
   2:  
   3: // Shows "true"
   4: alert(myString.startsWith("Hello"));
   5:  
   6: // Shows "false"
   7: alert(myString.startsWith("hello")); 
   8:  
   9: // Shows "true"
  10: alert("Just checking".startsWith("Just"));

So this extension is called on the instance of the object itself. Note that string are case sensitive and that "hello" is a string object. To in line #10 the "Just checking" is an instance of type String object - and therefore out extension function can be called.

This is a part of a work internal self-study course where I'm trying to share some knowledge about html, css and JavaScript. I'm posting tips and tricks here in my blog over the next few weeks.

 
Sunday, April 06, 2008 1:45:27 AM (Romance Daylight Time, UTC+02:00)  #    Comments [0] -
 
# Saturday, April 05, 2008

This post covers how to avoid text of a document being selected (or clear the text selection). This is useful when creating interactive web pages where the user left click the mouse or drag and drop.

In CSS3 this is pretty simple: Just add the user-select property to your stylesheet.. But - unfortunately, no released browsers support CSS3 fully at the moment, so in IE (Internet Explorer) we will have to use JS (JavaScript) but FF (Firefox) and Safari got a custom style(s) that looks like the CSS3 style.

Firefox and Safari

So let's handle this the easy way in FF v2 and Safari v3.1. Add the below to your CSS file (or in the STYLE tag).

body {
  -moz-user-select: none;
  -khtml-user-select: none;
}

The above looks like the CSS3 specifications except that FF2 has prefixed with "-moz-" (Mozilla) and Safari 3 with "-khtml-" (KHTML).

Internet Explorer

There are no CSS'ish way of doing this in IE7, so we will have to add some JS:

   1: var isIE = navigator.userAgent.indexOf(' MSIE ') > -1;
   2:  
   3: if (isIE) {
   4:     function clearSelection() {
   5:         try {
   6:             if (document.selection)
   7:                 document.selection.empty();
   8:         } catch(ex) {
   9:         }
  10:     }
  11:     document.attachEvent("onselectionchange", clearSelection);
  12:     document.attachEvent("ondblclick", clearSelection);
  13: }

In line #1 we detect if the current browser is IE (we don't care about versions here, although this sample is only tested in IE v7.0). This is done by checking the string value of the browsers user agent.

The user agent of your browser is:

Notice that we in line > #3 can imbed a FUNCTION declaration inside an IF statement. There are many was of declaring a function, here we just use the basic. This shows the dynamic way that JavaScript can be used - but it's also what's makes it a good platform for flimsy code. I wont recommend the code above - but lets keep things simple.

The function "clearSelection" wraps line #6+7 inside a TRY and CATCH. Read more about this here. Note that the "ex" variable in the catch is not used - but it needs to be declared anyway. The simplest way of showing the error would be: alert(ex.message);. The lines then check if the selection is valid, and if so - it calls document.selection.empty().

In line #11+12 we hook up the selectionchange and dblclick (double click) event for IE to the clearSelection method. This is done using the attachEvent method.

NOTE: The that the attachEvent method is IE specific - it is not a public standard, even thou it is still the one to use in IE browser version as late as 7.0.

NOTE: When referring to a method as a pointer - don't add the "()". Think of (in this case) clearSelection as a variable and clearSelection() as a call to the variable method.

This is a part of a work internal self-study course where I'm trying to share some knowledge about html, css and JavaScript. I'm posting tips and tricks here in my blog over the next few weeks.

 
Saturday, April 05, 2008 1:14:55 AM (Romance Daylight Time, UTC+02:00)  #    Comments [1] -
 
# Thursday, April 03, 2008

I just had to post these since I found them being gooood humor:

02608mindreaders03408diy

 
Thursday, April 03, 2008 1:56:11 AM (Romance Daylight Time, UTC+02:00)  #    Comments [0] -
 
# Monday, March 31, 2008
image

A new version of IE7Pro v2.2 has been release.

This add-in for IE7 provides a great set of features like:

  • Adds/banner blocker.
  • Reopen tabs on crash.
  • Download manager with resume etc.
  • Mouse gestures.
  • User scripts that lets you e.g. resize or download youtube movies etc.
  • Search from address bar.

I added "w" as an alias for address bar searching (see the picture on the right) and then simple type e.g. "w peanut" and it will show the relevant Wikipedia page:

w = http://en.wikipedia.org/w/index.php?title=Special:Search&search={KW_LOCALE}
m = http://www.imdb.com/find?s=all&q={KW_LOCALE}
y = http://www.youtube.com/results?search_query={KW_LOCALE}

Try it out by downloading it here.

 
Monday, March 31, 2008 8:14:23 PM (Romance Daylight Time, UTC+02:00)  #    Comments [0] -
 
# Sunday, March 30, 2008

SlowNetwork Have ever experienced a very slow file transfer in Vista? You have a 1GB network but it only transfers like a slow 100mbit?

Then try and close all media players and it might boost to true 1GB!.. I is a known problem, and here is a solution:

  1. Download and install SP1 for Vista
  2. Type "regedit" in run or search and hit enter.
  3. Browse to HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile
  4. Find the NetworkThrottlingIndex in the right pane and change it to (decimal) 100 (or fiddle around with a proper value).
  5. Reboot and try transfer again with music playing.
 
Sunday, March 30, 2008 12:19:49 AM (Romance Standard Time, UTC+01:00)  #    Comments [0] -
 
# Friday, March 28, 2008

Listen to this guy (in the video below) and how he builds the song into a music assemble using a loop station.

And here "Kid Beyond" does something similar but only using his voice - see the last 1/3.

 
Friday, March 28, 2008 11:37:14 PM (Romance Standard Time, UTC+01:00)  #    Comments [0] -
 

atiw95 I decided to Virtualize my current Vista installation so that I would be able to run a snapshot of my installation inside a virtual machine - preferably being able to run in Microsoft Virtual PC 2007 (download free).

In other words: Run my operating system (Vista) from "yesterday" in another window on my computer.

Why

I wanted an exact clone of my environments making sure that I have a branch that is tool, program and other unknown trouble independent. Also creating a backup that I can actually turn on and use.

To make sure of the above I didn't want to clone my system manually - and that takes up to 2 long days anyway's and I would not be sure that I got all the correct version and tools (msbuild extension, wix toolset etc. etc.).

Did not work

Last week a colleague bought Norton Ghost v14 from Symantech and I spent a lot of time and hard disk space first creating a backup of my system and then converting it to a .VHD file (virtual hard disk).

After some trouble (several issues) with Norton Ghost, and the fact that I couldn't get the converted VHD to work, I downloaded a trial version of True Image Workstation v9.1 from Acronis and this trial had, unlike Norton Ghost, all functionality and it worked! Well, upon booting the VHD in Virtual PC, Vista dead-locked on a black screen. Booting in sage mode would show that it freezed upon loading "crcdisk.sys" - and when converting the True Image Workstation image file to VHD the program did report a disk driver problems (didn't get a screen shot).

VMware-Workstation Instead of retrying the above (generating 100 GB from 100 GB takes a few hours) I decided to go for a convert to VMDK file instead - that is a VMware (a program like Virtual PC), and THAT worked.

So now I am uninstalling programs and trying to shrink the VMDK file to less than 100 GB - and maybe convert it to a VHD, but right now VMware Workstation is running smooth - but it is not free as Microsoft's Virtual PC is, but VMware Player is free and should be able to run an image after it has been build (the "True Image" software only creates the virtual hard-disk).

Sadly the exclude files in True Image (Ghost does have this option) apparently does not on a directory e.g. C:\TEMP\*.*

What does work

  1. Install True Image Echo Workstation (from Acronis)
  2. Create a full computer image/backup using "True Image" - this runs in the background while you can continue using your PC.
  3. Convert the generated image (.TIB file) to a VMware Virtual HD (.VMDK).
  4. Install VMware Workstaion (from VMware)
  5. Create a new machine using the VMDK file and ignore old version warning.
  6. Boot, install VM tools, remove unneeded files and programs and then shrink using the VM tools.

So now it time to take some of my old computers and create them into virtual machines and mount them in a virtual machine server, then I can recycle these old PC, get a more central and secure environment and save some electricity.

Remember that Vista has to be re-activated due to hardware changes.

 
Friday, March 28, 2008 6:03:05 PM (Romance Standard Time, UTC+01:00)  #    Comments [0] -
 
# Thursday, March 27, 2008
SouthPark

You can now watch all episodes of South Park! One of my favorite shows ever..

Here is one of my favorite episodes..

 
Thursday, March 27, 2008 11:35:00 AM (Romance Standard Time, UTC+01:00)  #    Comments [0] -
 
# Thursday, March 20, 2008

image I just found out that if you right click a folder in the file explorer while holding the SHIFT key down, an "Open Command Window Here" appears in the context menu and lets you go right into cmd.exe console window to do the nerdy stuff.

And while your in the command console, try out the rococopy /? command that replaces xcopy to copy and synchronize files and delete missing in target folder etc.

 
Thursday, March 20, 2008 12:17:49 AM (Romance Standard Time, UTC+01:00)  #    Comments [0] -
 
# Wednesday, March 19, 2008

ZA102026291030It's Easter but my Outlook 2007 calendar didn't know that - it's one of the (to) MANY leave days we have in Denmark.

Here is how to add the holidays for your country in Outlook 2007: English version and Danish version.

So, back to the Easter thing - which in Denmark is something about eating a lot of food, drinking extra strong beer and painting eggs... So it's like every other days except the egg painting thing.

Cheers!

 
Wednesday, March 19, 2008 3:40:31 PM (Romance Standard Time, UTC+01:00)  #    Comments [0] -
 
# Wednesday, March 12, 2008

windows-live-messsenger Remove add: If you are using Microsoft Windows Live Messenger (MSN Messenger), and if you want to remove the annoying animated add or show contacts images in a custom size in the contact list etc. – check out MessPatch. It can take a few tries to get your settings right - the way you want it.

Tip: In Messenger 8.5 you customize the color of the chat window for each contact - a great way of making sure you write to the right person. In the chat window (not the contact list window) select the color brush in the top right site of the chat window just above the contacts personal display picture.

Next version: In Messenger 9.0 we will see great new features like the ability to sign in using the same account from several PC's and assign pr. contact message sound just like personalized ring tones on your mobile phone. Also active links in personal status message, animated display picture (using gif). There's a BETA version available out there.

 
Wednesday, March 12, 2008 11:57:47 PM (Romance Standard Time, UTC+01:00)  #    Comments [0] -
 
# Monday, March 10, 2008

I did a short test on IE8 Beta 1 using the VPC/MS Virutal PC Version (download here) cause IE7 and 8 cannot be installed side by side. Short because I wanted to test a complicated xml'ish editor that I have been working on a quickly found out that IE8 is current to "buggy" the Beta way. In my case it failed at rows and cells arrays.

Quirksmode did an initial test here and I also found this one interesting.

 
Monday, March 10, 2008 1:33:31 PM (Romance Standard Time, UTC+01:00)  #    Comments [0] -
 


As of interest to me: .net, asp.net, dotnet, c#, csharp, vs.net, microsoft, vista, javascript, ajax, xsl, xslt, xml, xhtml, xpath, ie, ie7, css, sql, t-sql, msbuild, xaml