<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1272246033894754683</id><updated>2011-12-28T22:36:51.120+05:00</updated><category term='Random'/><category term='Copy Rows'/><category term='content page'/><category term='Passing Parameters to Threads'/><category term='Insert Rows'/><category term='Button CommandName'/><category term='Word to PDF'/><category term='Payoneer'/><category term='urdu textbox'/><category term='random number generator'/><category term='Password generator'/><category term='Exchange'/><category term='CheckBoxes'/><category term='GridView Select ALL'/><category term='.Net'/><category term='FogBugzKiln'/><category term='ASP.Net TextBox'/><category term='Threads'/><category term='projects'/><category term='FCK Editor'/><category term='Payoneer Blocked'/><category term='House'/><category term='Overflow'/><category term='ASP.Net Button'/><category term='recap'/><category term='MAC'/><category term='Programming'/><category term='Alpha numeric unique'/><category term='Wikipedia'/><category term='Exception'/><category term='MAC Address'/><category term='PDF Conversion'/><category term='upload FCK editor images'/><category term='TSQL Duplicate values'/><category term='Questions'/><category term='You tube'/><category term='Trouble'/><category term='IP'/><category term='Access Master Page'/><category term='Duplicate values'/><category term='Custom Images for FCK'/><category term='Master Pages'/><category term='TextBox'/><category term='DNN'/><category term='Master Page Labels'/><category term='Events'/><category term='contentpage'/><category term='Add GridView Rows'/><category term='urdu input'/><category term='Event Logger'/><category term='MS Word Conversion'/><category term='Threading'/><category term='unique'/><category term='number input'/><category term='Javascript'/><category term='Master Page Properties'/><category term='unique string generator'/><category term='Input'/><category term='GridView'/><category term='Custom Exceptions'/><category term='Stack'/><category term='Doc to PDF'/><category term='employer'/><category term='Google'/><category term='TSQL'/><category term='Event Logs'/><category term='C#'/><category term='BindData'/><category term='urdu'/><category term='Numeric TextBox'/><category term='company'/><category term='Careers'/><category term='Upload imgaes in DNN'/><category term='Learning'/><category term='Properties'/><category term='Jewish'/><category term='Single EventHandler for multiple controls'/><category term='Java Applets'/><category term='CommandArgument'/><category term='GridView rows'/><category term='Passing parameters using Button'/><category term='EventHandler'/><category term='Update GridView'/><category term='Word Conversion'/><category term='ASP.Net'/><category term='Block Access'/><category term='Select All checkBoxes'/><category term='Exception Logger'/><title type='text'>Rizwan's BLOG</title><subtitle type='html'>Programming Blog</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>65</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-725076783612265097</id><published>2011-03-21T17:02:00.000+05:00</published><updated>2011-03-21T17:03:02.888+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='House'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='Trouble'/><title type='text'>Trouble In the House of Google</title><content type='html'> &lt;P&gt;Let's look at where stackoverflow.com traffic came from for the year of 2010. &lt;P&gt;&lt;IMG title=Stack-overflow-2010-traffic-by-source border=0 alt=Stack-overflow-2010-traffic-by-source src="C:\Program Files\ABS\Auto Blog Samurai\data\Rizwan's BLOG\Jeff\" width=629 height=494&gt; &lt;P&gt;&lt;B&gt;When 88.2% of all traffic for your website comes from a single source&lt;/B&gt;, criticizing that single source feels … risky. And perhaps a bit churlish, like looking a gift horse in the mouth, or saying something derogatory in public about your Valued Business Partnertm. &lt;P&gt;Still, looking at the statistics, it's hard to avoid the obvious conclusion. I've been told many times that Google isn't a monopoly, but they apparently play one on the internet. You are perfectly free to switch to whichever non-viable alternative web search engine you want at any time. Just breathe in that sweet freedom, folks. &lt;P&gt;Sarcasm aside, I greatly admire Google. My goal is not to be acquired, because I'm in this thing for the long haul – but if I had to pick a company to be acquired by, it would probably be Google. I feel their emphasis on the information graph over the social graph aligns more closely with our mission than almost any other potential suitor I can think of. Anyway, we've been perfectly happy with Google as our de-facto traffic sugar daddy since the beginning. But last year, something strange happened: &lt;B&gt;the content syndicators began to regularly outrank us in Google for our own content&lt;/B&gt;. &lt;P&gt;Syndicating our content is not a problem. In fact, it's encouraged. It would be deeply unfair of us to assert ownership over the content so generously contributed to our sites and create an underclass of digital sharecroppers. Anything posted to Stack Overflow, or any Stack Exchange Network site for that matter, is licensed back to the community in perpetuity under Creative Commons cc-by-sa. The community owns their contributions. We want the whole world to teach each other and learn from the questions and answers posted on our sites. Remix, reuse, share – and teach your peers! That's our mission. That's why I get up in the morning. &lt;P&gt;&lt;IMG title="Jeff Atwood: Teaching peers is one of the best ways to develop mastery" alt="Jeff Atwood: Teaching peers is one of the best ways to develop mastery" src="C:\Program Files\ABS\Auto Blog Samurai\data\Rizwan's BLOG\Jeff\" width=423 height=442&gt; &lt;P&gt;However, implicit in this strategy was the assumption that we, as the canonical source for the original questions and answers, would always rank first. Consider Wikipedia – &lt;B&gt;when was the last time you clicked through to a page that was nothing more than a legally copied, properly attributed Wikipedia entry encrusted in advertisements?&lt;/B&gt; Never, right? But it is in theory a completely valid, albeit dumb, business model. That's why Joel Spolsky and I were confident in sharing content back to the community with almost no reservations – because Google mercilessly penalizes sites that attempt to game the system by unfairly profiting on copied content. Remixing and reusing is fine, but mass-producing cheap copies encrusted with ads … isn't. &lt;P&gt;I think of this as common sense, but it's also spelled out explicitly in Google's webmaster content guidelines. &lt;BLOCKQUOTE readability="9"&gt;However, some webmasters attempt to improve their page's ranking and attract visitors by creating pages with many words but little or no authentic content. &lt;B&gt;Google will take action against domains that try to rank more highly by just showing scraped or other auto-generated pages that don't add any value to users.&lt;/B&gt; Examples include: &lt;P&gt;Scraped content. Some webmasters make use of content taken from other, more reputable sites on the assumption that increasing the volume of web pages with random, irrelevant content is a good long-term strategy. Purely scraped content, even from high-quality sources, may not provide any added value to your users without additional useful services or content provided by your site. It's worthwhile to take the time to create original content that sets your site apart. This will keep your visitors coming back and will provide useful search results. &lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;In 2010, our mailboxes suddenly started overflowing with complaints from users – complaints that they were doing perfectly reasonable Google searches, and ending up on scraper sites that mirrored Stack Overflow content with added advertisements. Even worse, in some cases, the original Stack Overflow question was nowhere to be found in the search results! That's particularly odd because our attribution terms require linking directly back to us, the canonical source for the question, without nofollow. Google, in indexing the scraped page, cannot avoid seeing that the scraped page links back to the canonical source. This culminated in, of all things, a special browser plug-in that redirects to Stack Overflow from the ripoff sites. How totally depressing. Joel and I thought this was impossible. And I felt like I had personally failed all of you. &lt;P&gt;The idea that there could be something wrong with Google was inconceivable to me. Google is gravity on the web, an omnipresent constant; &lt;B&gt;blaming Google would be like blaming gravity for my own clumsiness.&lt;/B&gt; It wasn't even an option. I started with the golden rule: it's always my fault. We did a ton of due diligence on webmasters.stackexchange.com to ensure we weren't doing anything overtly stupid, and uber-mensch Matt Cutts went out of his way to investigate the hand-vetted search examples contributed in response to my tweet asking for search terms where the scrapers dominated. Issues were found on both sides, and changes were made. Success! &lt;P&gt;Despite the semi-positive resolution, I was disturbed. If these dime-store scrapers were doing so well and generating so much traffic on the back of our content – how was the rest of the web faring? My enduring faith in the gravitational constant of Google had been shaken. Shaken to the very core. &lt;P&gt;Throughout my investigation I had nagging doubts that we were seeing &lt;B&gt;serious cracks in the algorithmic search foundations of the house that Google built&lt;/B&gt;. But I was afraid to write an article about it for fear I'd be claimed an incompetent kook. I wasn't comfortable sharing that opinion widely, because we might be doing something obviously wrong. Which we tend to do frequently and often. Gravity can't be wrong. We're just clumsy … right? &lt;P&gt;I can't help noticing that we're not the only site to have serious problems with Google search results in the last few months. In fact, the drum beat of deteriorating Google search quality has been practically deafening of late: &lt;P&gt;Anecdotally, my personal search results have also been noticeably worse lately. As part of Christmas shopping for my wife, I searched for "iPhone 4 case" in Google. I had to give up completely on the first two pages of search results as utterly useless, and searched Amazon instead. &lt;P&gt;People whose opinions I respect have all been echoing the same sentiment -- &lt;B&gt;Google, the once essential tool, is somehow losing its edge. The spammers, scrapers, and SEO'ed-to-the-hilt content farms are winning.&lt;/B&gt; &lt;P&gt;Like any sane person, I'm rooting for Google in this battle, and I'd love nothing more than for Google to tweak a few algorithmic knobs and make this entire blog entry moot. Still, this is the first time since 2000 that I can recall Google search quality ever declining, and it has inspired some rather heretical thoughts in me -- are we seeing the first signs that algorithmic search has failed as a strategy? Is the next generation of search destined to be less algorithmic and more social? &lt;P&gt;It's a scary thing to even entertain, but maybe gravity really is broken. Posted by Jeff Atwood    View blog reactions&lt;P&gt;I'm pretty sure I would buy a stress ball shaped like your head.&lt;/P&gt;William Stevenson on January 3, 2011 3:41 AM &lt;P&gt;Anecdotally I had the same problem the other day. Horror of horrors Bing was better in the end!&lt;/P&gt;Alexandronov on January 3, 2011 3:47 AM &lt;P&gt;This is a really interesting article and reflects what I have been feeling for a while, that the relentless and exponential rise in SEO activity would eventually start to affect the usefulness of Google. &lt;BR&gt;In a weird way it feels analogous to when people say that Windows gets more virus attacks because it has a bigger audience than other operating systems rather than being less secure necessarily (Im not saying it isn't)&lt;BR&gt;In other words, perhaps Bing has an advantage here as it is less targeted by SEO activity, the same way that non-Windows operating systems dont suffer the same level of virus attacks? &lt;/P&gt;Barry Lloyd on January 3, 2011 3:53 AM &lt;P&gt;You’re confusing a model with reality: Google isn’t gravity, they’re trying to *model* it using their ranking algorithm. And as your experience clearly shows, it is currently modelling gravity (i.e. the “reality” of which sites are relevant and which aren’t) badly.&lt;/P&gt;&lt;P&gt;To stay in your metaphor, it’s clearly time for a paradigm shift, a kind of Einstein of web ranking algorithms. Sounds like a very interesting thesis topic. cstheory.SE, anyone?&lt;/P&gt;Konrad on January 3, 2011 3:53 AM &lt;P&gt;I recall that for a while mirror sites started edging out Wikipedia. Google apparently added a bonus for Wikipedia just to force it to the top over its clones. Is it reasonable to expect them to do that for everyone? I don't know.&lt;/P&gt;Peter Da Silva on January 3, 2011 3:58 AM &lt;P&gt;This is exactly the reason why I supported webmasters.se so adamantly. Where else could someone go to get great expert help for problems like this?&lt;/P&gt;&lt;P&gt;I've often wondered about the case of Wikipedia, and how scrapers that simply syndicate it are quickly penalized. I think Google has _some_ sort of 'special intervention' when it comes to Wikipedia. I just hope they afford the same luxury to Stack Exchange.&lt;/P&gt;Tinkertim on January 3, 2011 4:06 AM &lt;P&gt;I have been frustrated with this in recent months also. A scraping website has recently copied the top posts from my blog verbatim without even attributing the original. Google somehow ranks the copies with a higher page rank, causing a significant drop in my stats.&lt;/P&gt;&lt;P&gt;The worst thing is that you are mostly powerless in this situation; who do you complain to, google? &lt;/P&gt;Meekrosoft.wordpress.com on January 3, 2011 4:06 AM &lt;P&gt;I was recently shown an application for blind testing search engines ( http://blindsearch.fejus.com/ ), and was surprised to find that Bing and Yahoo often delivered better results than Google.&lt;/P&gt;Krisjoh on January 3, 2011 4:11 AM &lt;P&gt;There are search terms that do not list Wikipedia content on the first page, but scraped content as the first result, e.g. http://www.google.com/search?q=elvett+semic &lt;/P&gt;&lt;P&gt;I have tested it from Germany, if it makes any difference.&lt;/P&gt;Residuum on January 3, 2011 4:13 AM &lt;P&gt;It is because contrary to wikipedia people don't link back to StackExchange, they just want the info and close the tab, so the original content provider doesn't gain anything.&lt;/P&gt;&lt;P&gt;But we should try to find why spammers are better than you, what are they doing better ? You should ask them.&lt;/P&gt;Hokkos on January 3, 2011 4:23 AM &lt;P&gt;In a techcrunch post (http://techcrunch.com/2011/01/01/why-we-desperately-need-a-new-and-better-google-2), Vivek Wadhwa said the same thing. Trouble over google head ?&lt;/P&gt;Tyseo on January 3, 2011 4:55 AM &lt;P&gt;This is a really interesting article. More and more recently these sites are taking priority but I have only seen it with stack overflow related content. I always end up ignoring them and trying to find the stack overflow link as ultimately the number of adverts show you the content didn't originate on that site but I think as other people have said it would be interesting to find out why these sites are taking priority. &lt;/P&gt;Scsmith on January 3, 2011 4:56 AM &lt;P&gt;Wait - "broken" doesn't mean "broken beyond repair", let alone that somebody else would be able to provide a better fix.&lt;/P&gt;&lt;P&gt;At first sight this is merely a problem of Google neglecting to use a specific bit of information in their filtering, namely the information who copied content from who. It won't be possible to do this automatically with 100% accuracy, but I guess if you take all content from two webpages as prepared for indexing (that is, basically the plaintext conversion), compare them for similarity, and when found to be similar, downgrade the ranking of the one to appear most recently (which is not so very easy to determine) then you can mostly fix this problem.&lt;/P&gt;&lt;P&gt;The basic problem I see is that even with smart optimization techniques (e.g. limit comparisons to pages with similar sets of keywords) the similarity testing required probably won't scale. However there are ways around that too (e.g. don't calculate it at indexing time but spread the calculation over queries at querying time, to make ranking progressively smarter, but I have no idea if Google's infrastructure allows stuff like this).&lt;/P&gt;reinierpost on January 3, 2011 4:59 AM &lt;P&gt;What we need is a quality measure for search result and this can only be provided by the user. The best way to collect user feedback is by making the process social. &lt;/P&gt;&lt;P&gt;Google previous vote up/down is lacking in social interaction, it could for example shows how many users vote up/down for a certain site.&lt;/P&gt;Charles Gunawan on January 3, 2011 5:10 AM &lt;P&gt;It's something annoying indeed. There will always be ways of cheating the system, but I think Google should close the holes in a faster pacing.&lt;/P&gt;Leniel Macaferi on January 3, 2011 5:12 AM &lt;P&gt;Google should buy delicious and add relevance based on number of bookmarks and it's tags. =)&lt;BR&gt;When search results show only a bunch of add based with no real content sites I go to delicious and the same search most of the time brings helpful results.&lt;/P&gt;Iraê Lambert de Carvalho on January 3, 2011 5:13 AM &lt;P&gt;Thank you for this. For near two years I've seen an increasing deterioration in the usefulness of Google results and thought that was what was happening to the web in general ("blogging is dead," for example). The few times I used another search engine, the results were better and that confused me, given my past experience with how good Google once was. At least now I know it's not the web in general and it's not been my imagination: It's been Google.&lt;/P&gt;twitter.com/mikecane on January 3, 2011 5:25 AM &lt;P&gt;I used to work at a search engine company, so I know this is a very difficult problem, and I honestly do believe Google is trying their hardest, but clearly not enough, and you have to wonder if it's partly because they are making money in many cases from those scraper sites (IE they have Google ads).&lt;/P&gt;&lt;P&gt;My site - http://www.ausedcar.com used to be in the top 10 on Google for the very popular keywords "used cars" but I've been knocked back to around #45 over the years simply because everyone in front of me uses black hat SEO. Including major million dollar companies! The only difference is that Google is not going to blacklist a major company, while they probably would blacklist me, so there is essentially no way for the little guy to do anymore then hope Google will give some scraps off the table.&lt;/P&gt;&lt;P&gt;The fact that you simply can't do a product review search on Google anymore without getting spam is serious trouble for Google. Unfortunately Bing seems to copy the same algorithm, if they were the "Anti-spam" engine, they could gain real ground.&lt;/P&gt;Phil Anderson on January 3, 2011 5:26 AM &lt;P&gt;There's one thing that I never understand by any critic of Google (especially in the search domain), when you say: &lt;/P&gt;&lt;P&gt;"Still, looking at the statistics, it's hard to avoid the obvious conclusion. I've been told many times that Google isn't a monopoly, but they apparently play one on the internet. You are perfectly free to switch to whichever non-viable alternative web search engine you want at any time. Just breathe in that sweet freedom, folks."&lt;/P&gt;&lt;P&gt;What do you mean? &lt;/P&gt;&lt;P&gt;Do you expect that a better search engine just materialize out of thin air? What are you expecting? That perhaps Google should fund their competition? Maybe they should hold back a bit on improving their technology and let the other poor souls catch up? &lt;/P&gt;&lt;P&gt;One thing I dislike very much is when people feel entitled, like it's their birthright, to something they should work hard for. Have all the free internet services gotten you into the mindset of a spoiled consumer? This is not how entrepreneur thinks, this kind of thinking is not going to make the world go round. &lt;/P&gt;&lt;P&gt;Yes, you are right, you are being "churlish", show me a better search engine and then we'll talk. &lt;/P&gt;Victorbstan on January 3, 2011 5:28 AM &lt;P&gt;I'm a member of StackOverflow, but I got into the habit of using Google to search for results on StackOverflow. When I remember, I just scope the search to limit to only the stackoverlow.com site.&lt;/P&gt;&lt;P&gt;But, as your Amazon search experience, I'd just search StackOverflow directly if I felt the search results would be as good as Google. (I haven't compared recently)&lt;/P&gt;Bikeoid on January 3, 2011 5:30 AM &lt;P&gt;Moving away from content-based ranking feels scary to me. I'd rather have things stay as they are. Or, if you will, give the social search engine as an optional approach to enrich the algorithmic search. &lt;/P&gt;&lt;P&gt;I feel the problem with Google however is not the algorithms, but the absence of essential information that can no longer be ignored; i.e. Google has to stop presenting results as a veritable shopping list and seriously consider the introduction of categories into its search engine.&lt;/P&gt;&lt;P&gt;This much was attempted by Cuil and was my favorite feature of that otherwise failed attempt at producing an alternative to Google. Backed up by intelligent algorithms like Google is capable of doing, scrapers wouldn't be able to avoid being moved to their own category away from normal searches.&lt;/P&gt;Mario Figueiredo on January 3, 2011 5:39 AM &lt;P&gt;&lt;conspiracytheory&gt;It seems to happen every year in the leadup to christmas when companies need to rank well (and will pay for adwords if they aren't ranking)&lt;/conspiracytheory&gt;&lt;/P&gt;Ilikeprivacy on January 3, 2011 5:43 AM &lt;P&gt;I remember very well that i asked some friends if they've noticed how google results deteriorated the day google instant search was deployed.&lt;BR&gt;Another clear difference is in the way apple sdk documentation don't appear anymore among google search results ( although in that case it may very well be apple's decision).&lt;/P&gt;Benjamin Garrigues on January 3, 2011 6:01 AM &lt;P&gt;this may be overly simplistic but could the magic dial google needs to turn simply be to adjust how the date something is published adds to the ranking? &lt;/P&gt;&lt;P&gt;on most searches say for "lady gaga" they should return the content with the most current date.&lt;/P&gt;&lt;P&gt;on a search for "binding a select list with MVC.Net" the scraped site is going to have a more recent date but should be ranked lower.&lt;/P&gt;&lt;P&gt;either way &lt;B&gt;this problem seems to show up when using google to research technical solutions more so than other things.&lt;/B&gt;&lt;BR&gt;&lt;/P&gt;ctrlShiftBryan on January 3, 2011 6:02 AM &lt;P&gt;I link to StackOverflow quite a bit in my Buzz. I wonder if Google has though of using Buzz as an input? :)&lt;/P&gt;Peter Da Silva on January 3, 2011 6:07 AM &lt;P&gt;Google has been giving terrible results for product searches for a long time now. I tried to research a new dishwasher a few years ago and Google was a mess.&lt;/P&gt;&lt;P&gt;Google's main problem right now is that they think they can stay ahead of the black hat SEO with algorithms. Take it from somebody who used to work in the anti-spam and anti-virus world ... you can't! You need to use more than algorithms, in particular you need to use feedback from your users.&lt;/P&gt;&lt;P&gt;Google has a huge database of data on it's users. Google &lt;B&gt;knows&lt;/B&gt; I've been using google and gmail for years, that I'm a real person, I use Google search dozens of times a day and I'm pretty technical. If Google had a "this is spam" or "this is not useful" button the would have millions of pre-validated curators to help them filter results. &lt;/P&gt;Robert Osborne on January 3, 2011 6:22 AM &lt;P&gt;I've been seeing a ton of efreedom.com &amp; questionhub.com data dumps of stackoverflow outranking you all through the holiday break.&lt;/P&gt;Comforteagle on January 3, 2011 6:25 AM &lt;P&gt;I don't think "social" is the answer to better search results. In fact, I think it makes it worse. &lt;/P&gt;&lt;P&gt;- First of all, there is no reason to believe that spammers cannot manipulate a social search engine. Just look at sites like Digg.com where at one point people were getting paid to blindly vote content up. &lt;/P&gt;&lt;P&gt;- Even with educated, moral users minus the spammers social search ranking would most likely result in search result popularity indicators, which is not necessarily actually the best search result.&lt;/P&gt;&lt;P&gt;- It is questionable in the first place whether users at all would rank search engine results. They just want the result.&lt;/P&gt;&lt;P&gt;I'm hoping this recent problem can be solved by an algorithm, as I place more trust into that than mankind itself. &lt;/P&gt;Fchristant on January 3, 2011 6:26 AM &lt;P&gt;The scrapers are probably doing lot of SEO optimization. It is time for stack overflow to hire some SEO services. Wikipedia is not monetizing in anyway other than donations whereas stackoverflow does display ads of its own so why not hire someone to do SEO and stay on top?&lt;/P&gt;Nilesh Jethwa on January 3, 2011 6:43 AM &lt;P&gt;As I understood you're talking about &lt;B&gt;scrapers&lt;/B&gt;, that try to cheat google algorithms (if the algos change, the cheating will eventually evolve) but you're blaming &lt;B&gt;google&lt;/B&gt;, and not the scrapers??&lt;/P&gt;&lt;P&gt;What about SPAM, whose fault is it?&lt;/P&gt;&lt;P&gt;(just to be clear, I see google in this case more as a victim than as a villain)&lt;/P&gt;Leonardo de Oliveira Martins on January 3, 2011 6:56 AM &lt;P&gt;I hate to play devil's advocate here, but I've noticed that efreedom.com, one of the SO scrapers, actually provides significantly better search and related question generation than SO does. There's a fine line between being a leach and being a value-added content aggregator.&lt;/P&gt;Erikengbrecht.blogspot.com on January 3, 2011 7:07 AM &lt;P&gt;I've had a bad taste in my mouth for all things Google for a looong time.&lt;/P&gt;&lt;P&gt;At first there were some growing pains with it, but I've moved to Bing as a search engine and at this point, to me it feels speedy and lean like Google used to.&lt;/P&gt;&lt;P&gt;When I have gone to Google to look something up, I find that the result list is a near useless mess of ads, spam, and a general waste of time.&lt;/P&gt;me.yahoo.com/a/wFcHGRpgnua_OqaxYt1WsXU_M_Lw1A-- on January 3, 2011 7:07 AM &lt;BLOCKQUOTE&gt;As I understood you're talking about scrapers, that try to cheat google algorithms (if the algos change, the cheating will eventually evolve) but you're blaming google, and not the scrapers??&lt;/BLOCKQUOTE&gt;&lt;P&gt;Google has always been about organizing oceans of chaos into something manageable and searchable. Lately they've failed in two respects. First, their searches are finding more noise and less signal. Google is supposed to be chock full of the best minds on the Internet and their algorithms are being beaten soundly. Not only has SO been s&lt;/P&gt;Clintp on January 3, 2011 7:24 AM &lt;P&gt;(continued... damned mouse touchpad error) &lt;/P&gt;&lt;P&gt;...Not only has SO been squeezed out of the rankings, but I found Christmas shopping online to be much worse this year than last because what I wanted was buried under crap search results. Maybe they've stopped trying or caring about search.&lt;/P&gt;&lt;P&gt;Secondly, Google is the 800lb Gorilla of the Internet. If they wanted, they could simply crush anything that opposed them. I've been dying for a "never show me results from this site again" button in Google's search results. One click and the offensive scrapers go away.&lt;/P&gt;&lt;P&gt;Bing, on the other hand, seems active in tweaking and refining results...&lt;/P&gt;Clintp on January 3, 2011 7:30 AM &lt;P&gt;&gt;&gt; I've been dying for a "never show me results from this site again" button in Google's search results.&lt;/P&gt;&lt;P&gt;Indeed. A content-based algorithmic search with the addition of user tools should be the way to go. I'd really like to manage my search results, and I don't mean in the way of voting for links like Google has implied sometime ago with their social searching services. That won't solve the problems and will introduce new ones (like social engineering or regional/cultural encroachment).&lt;/P&gt;&lt;P&gt;The current model is becoming expired and the "market" of content consumers is becoming less relevant in Google search results. This was once the great novelty of Google and what elevated them to their present status.&lt;/P&gt;Mario Figueiredo on January 3, 2011 8:11 AM &lt;P&gt;Reminds me of Ben Croshaw's comments on user-created video game DLC: "...and don't tell me user ranking is the answer, because anything that references Naruto will automatically get five stars."&lt;/P&gt;Chris Doherty on January 3, 2011 8:43 AM &lt;P&gt;@Clintp Interestingly that "never show me results from this site again" button used to be in google's results but isn't anymore. I miss it! Meanwhile we can try this extension: https://chrome.google.com/extensions/detail/ddgjlkmkllmpdhegaliddgplookikmjf&lt;/P&gt;Scott Willeke on January 3, 2011 8:44 AM &lt;P&gt;I've noticed Google results being gamed for the last 6 months at least. Too many sites devoid of actual content being listed at or near the top of the results. software.informer.com was the first I noticed, but it's only gotten worse.&lt;/P&gt;&lt;P&gt;Lately I've switched to duckduckgo.com and msdn for any technical searches. MSDN even includes stackoverflow results!&lt;/P&gt;Jobu on January 3, 2011 8:45 AM &lt;P&gt;This is an interesting twist on the software monoculture problem. By being the overwhelming favorite, Google gives spammers a single target to focus on.&lt;/P&gt;&lt;P&gt;On the other hand, unlike viruses, there are no inherent platform differences that prevent spammers from tweaking their content scrapers to poison other search engines as well. So if Bing were to gain more market share its results would likely start to drown in noise as well unless they have some secret sauce (or armies of content reviewers) to defend the walls against the barbarian hordes of spammers.&lt;/P&gt;&lt;P&gt;The problem with adding a button that says "this web site is useful" or "report abuse" is that it shifts the battle to gaming that metric instead.&lt;/P&gt;&lt;P&gt;The other problem is that from the algorithm's perspective, information is information, so who cares if some content scraper serves up information copied from someone else as long as you the searcher get the answer you're looking for, right? In some cases, the sites in question could be legitimate mirrors. When discussing flaws in the ranking algorithm, this goes to the heart of how you phrase the question -- assuming there are no flaws in the software, it is probably performing as intended, and this is essentially a garbage in/garbage out problem. Unfortunately, there is a &lt;B&gt;lot&lt;/B&gt; of garbage on the Internet.&lt;/P&gt;Peter Amstutz on January 3, 2011 8:46 AM &lt;P&gt;I do find that if I search for a product I end up getting drek back, but on the flip side it is drek offering to sell me the product, which is a reasonable assumption. The search for iphone cases mentioned above is a good case in point. &lt;/P&gt;&lt;P&gt;I will admit to being somewhat of a Google fanboy, but then I also have a lot of patience and am willing to venture as far as page 20 in search of useful results, I'm also making friends with Google shopping, not to mention continuing to read magazines. I find that helps me find products to search for. &lt;/P&gt;&lt;P&gt;Personally I've never had a problem with searching for technical data, but I understand that if you're producing it, that could be an issue due to the amount of drek and scraping that is served up. &lt;/P&gt;&lt;P&gt;I'm sure they'll get on top of it, otherwise people will vote with their feet so to speak.&lt;/P&gt;John Doh on January 3, 2011 8:52 AM &lt;P&gt;It seems like search result quality went down with the recent real-time searching update. Maybe stuff like real-time twitter search beating Google made them rush out a non bulletproof real-time algorithm. Most likely this will improve with time as long as search is still the highest priority at Google.&lt;/P&gt;Ryan Christensen on January 3, 2011 9:06 AM &lt;P&gt;Google is not gravity, it is a part (only a part) of the mechanics of natural selection (Darwin is The Dude, not Newton). The ecosystem has changed, which is all too predictable, but the law (force?) is still there. That something else will have to be added to the picture, possibly on top of Google - probably inside it too - is pretty obvious: we a still at the rehearsal phase of the Web. And Google still has a lot to show in the infrastructural front. Also, we need to think differently about our own data, and we will.&lt;/P&gt;&lt;P&gt;But I have to say, agreeing with you, that it is not the semantics, the secret is still on the syntax. Syntax is our stuff.&lt;/P&gt;Aslemos on January 3, 2011 9:27 AM &lt;P&gt;Maybe it's time to use &lt;B&gt;blekko&lt;/B&gt;?&lt;/P&gt;Adam Rich on January 3, 2011 9:32 AM &lt;P&gt;Just thinking out loud, but Google did make some changes this year... adding Caffeine and all.&lt;/P&gt;Ian Philpot on January 3, 2011 10:01 AM &lt;P&gt;I wholly agree as to the poor recent performance of Google's search results. I was just recently looking for binaural audio (I have my doubts, but was curious) and the results Google returned were garbage, with many results hosting identical content. The scammers are currently winning, or Google has failed to continue to implement its core concept.&lt;/P&gt;&lt;P&gt;That being said, in the search realm, this seems similar to what happened in the earlier days when Lycos promoted itself as having more indexed pages than any other search engine. That was a relatively easy hallmark to beat, so Lycos died rapidly. If someone else comes along with a much better search algorithm than Google at this stage, they just might have inertia like the early Google did. Or, more likely, the wealthy Bank of Google will buy them out.&lt;/P&gt;Greg Webster on January 3, 2011 10:06 AM &lt;P&gt;Great post, and a great idea Iraê to add Delicious into the algorithm.&lt;/P&gt;&lt;P&gt;I agree that we should be using other search engines and also like comparison engines such as http://blindsearch.fejus.com/ but believe it will take a huge upheaval for what we have learned as a species over the last 10 years to change behaviour on the sort of scale needed to alter the statistics as above.&lt;/P&gt;&lt;P&gt;Google has fallen foul of it's own algorithmic success and is at a stage where diversification seems to be their strategy rather than adding in other methods for improving results. Personally I can't see Google winning and am keen to see what new players will come into this space. I believe more complex algorithms that search multiple resources and think/calculate longer before results are returned could be the way to go.&lt;/P&gt;timaldiss on January 3, 2011 10:07 AM &lt;P&gt;While annoying when it happens, this is really nothing new. Several years back Google search results were inundated with parked domains only serving ads and other such useless pages. Google eventually cleaned up their algorithm. Sometimes their ranking system is gamed, other times they may make changes reducing the quality of rankings.&lt;/P&gt;&lt;P&gt;I considered switching to a new search engine and before I could find a better one, they fixed the problem.&lt;/P&gt;&lt;P&gt;Complain and then give them a chance to improve. It's a well established cycle that works very well for them.&lt;/P&gt;Michael Silver on January 3, 2011 10:45 AM &lt;P&gt;I've been noticing for some time now that the results have not been as good as they were and I regularly find myself either trying more and more detailed terms or other search filters to help find what I'm looking for, and often it is not in the first 3-5 results.&lt;/P&gt;&lt;P&gt;Right now, my default engine is Bing and I'm finding better results there for some queries but they haven't indexed as much of the web as Google has so Bing's results are good, but still needs more time to develop.&lt;/P&gt;&lt;P&gt;Google on the other hand has been getting less and less reliable and I'm finding more and more content scrappers showing up in the top results and from what I can tell I've been noticing the decline in quality ever since the Mayday Update from last year. Since that time the quality of results for longer tail stuff have been a lot more inconsistent and there seems to be a lot more non-relevant data showing up in the longer tail searches.&lt;/P&gt;&lt;P&gt;Also, I don't like Google trying to show me results before I even typed in what I want. If I'm looking for a new car, and type in 'new cars' in Google, they end up giving me 'netflix' for the first letter n, 'netflix' again with the second letter added (ne), 'New York Times' when I type in the third letter (new), 'New York Times' when I add the space (new ), and if I add the first letter for the next work I still don't get what I'm looking for 'New Century Bus' for (new c), 'New Carrollton Metro Station' for the next letter (new ca), and it still doesn't get the search right even if I type in the last letter so now I've typed in 'new car' and the results that I'm getting in the instant are for 'New Carrollton' and noting about new cars is coming up. However, if I look at their suggestion list the actual result that I wanted is showing up as #3 on their list, but the problem is that I typed in the exact term I wanted to search for and instead of giving me what I wanted, I'm getting some other search that is not even close to being relevant or of any quality for me. With this in mind, I personally think their instant search is a joke, waist of time, and a big nuisance because I got 7 different search results for what I typed in and not one of them is actually relevant or what I'm looking for. What a big mistake Google made on releasing what I call their 'Crystal Ball' search where they are trying to predict what you want but are not doing a very good job of it.&lt;/P&gt;SalSurra on January 3, 2011 11:12 AM &lt;P&gt;Great blog post. I can't imagine what effect an increase of that 88.2% will have if Google makes a better model. &lt;/P&gt;Brian R. Bondy on January 3, 2011 11:24 AM &lt;P&gt;Jeff,&lt;BR&gt;Do you continue to interact with Matt Cutts on this matter? Matt's opinion would be most interesting and most convincing.&lt;BR&gt;You have not provided any material evidence any particular search, etc. to prove what you said in this article. Do you own any statistics? I admire StackOverflow, I know that you are a well know person in Web / programming circles, but it lately became very fashionable to attack Google.&lt;/P&gt;&lt;P&gt;Somewhat related article was published on TechCrunch (no real data either) at http://techcrunch.com/2011/01/01/why-we-desperately-need-a-new-and-better-google-2/&lt;/P&gt;&lt;P&gt;I'm pretty sure there will be related discussion in Google Buzz, hopefully with Google employees, including Matt Cutts at&lt;BR&gt;http://goo.gl/6eVTw&lt;BR&gt;http://goo.gl/xCDsD&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;Vladimir Kelman on January 3, 2011 11:26 AM &lt;P&gt;Over the last year or so I've noticed Google's results getting worse. I basically taught myself design and front-end development by googling. Now, when I try to google for the most basic of searches I have a hard time finding the god content that was once right in front of me. &lt;/P&gt;&lt;P&gt;I've had to type more detailed searches, use the timeline features on the left sidebar and I started using delicious as a search engine for web related stuff more and more.&lt;/P&gt;&lt;P&gt;An article I read last night mentioned blekko.com (often times much easier to find what I'm looking for there) - I tried it out a few months ago but added it to my bookmarks bar recently and have been getting used to using it the last few days. &lt;/P&gt;&lt;P&gt;I'm glad other people are starting to notice google's bad results and hopefully the more people talk about it they'll the more google will work on improving and getting back to the search results of a year or two ago when I was actually able to find stuff...quickly.&lt;/P&gt;&lt;P&gt;I also noticed 'stack scrapers' recently and figured you guys would be a little upset. It's not their users creating the content, why the hell should they make money piggy backing off of you. But yes, if someone scrapes your content the original content should always be placed first in the results. &lt;/P&gt;&lt;P&gt;Good luck, hope you guys get it resolved and hope I get my google back.&lt;/P&gt;hav0k on January 3, 2011 11:27 AM &lt;P&gt;I don't think we should be surprised by this. Google might say that they're in business to make the world a better place, but let's be honest... they have a responsibility to their stock holders to be as profitable as possible, and I believe that letting some of the scrapers move to the top of the list can only be padding the bottom line at Google. After all, how many of those scraper sites have placed AdSense ads on their sites?&lt;/P&gt;AJ Rabe on January 3, 2011 11:29 AM &lt;P&gt;So, let's see:&lt;BR&gt;1. Google's primary income comes from AdSense ads.&lt;BR&gt;2. StackOverflow doesn't have AdSense ads.&lt;BR&gt;3. efreedom have Google AdSense ads.&lt;/P&gt;&lt;P&gt;If you were Google, which site do you want people to go to?&lt;/P&gt;&lt;P&gt;You do the math.&lt;/P&gt;InsomniacGeek on January 3, 2011 11:45 AM &lt;P&gt;Perfect example: I just searched "Android tablet" and clicked on the Google News tab. The 1st link I'm offered is for a site "TMCnet.com". It talks about Toshiba's new tablet being launched later this year. But throughout the article, it constantly links back to the "REAL" sources of the article, engadget and crunchgear. &lt;/P&gt;&lt;P&gt;So, how does an article by TMCnet.com, which is basically regurgitating what the other 2 more legitimate sources are saying, JUMP AHEAD of the actual sources? How is that possible? Interestingly, I didn't find any Google Adwords on their site, so that's not the motivation in this case.&lt;/P&gt;RobertNaum on January 3, 2011 11:48 AM &lt;P&gt;Yes, converging feelings about social vs algorithmic search, I would say it is a recurrent rethoric now at each year's end.&lt;/P&gt;&lt;P&gt;Last year's passage (2009/2010) we had predictions and high praise of "real-time search" which could make Google bite the dust. &lt;/P&gt;&lt;P&gt;Where is real-time search now ? Where is real-time social search either ? the point of it and the results of it ?&lt;/P&gt;thierryl on January 3, 2011 11:54 AM &lt;P&gt;I have long held that Search (ie, Google) would eventually bend to an anti-network-effect, where the SEO-gamers would eventually win and smaller search engines would flourish. I'm fond of DuckDuckGo right now. However, Google has gotten their edge back several times over the last few years, and I wouldn't count them out. I agree that Google is currently losing, and I recommend people try the blind search tests themselves.&lt;/P&gt;&lt;P&gt;I believe Google's strength will come in personalized search results, and I don't think Google is using personalization as much as they need to. If I bypass all the other links and go direct to StackOverflow every time, it would seem that - for me - this should work itself out quickly. I would be interested in whether your experiments with StackOverflow were with "clean accounts" or crusty accounts like mine, where the searcher is a known technologist.&lt;/P&gt;&lt;P&gt;Regarding someone who posted about categorization, Google's Caffine architecture, and the search results currently being returned, show a high amount of diversity. They're clearly categorizing and showing "best in category" in the front page results. This effect is positive for a number of kinds of search, but negative for "tight searches" (like iphone 4 covers, where you might end up with a ipad cover taking a slot due to a diversity algorithm, to the point where you're only delivering 4 or 5 results that were tight).&lt;/P&gt;&lt;P&gt;An improvement I would like to see in Google is a Google Labs experiment with a prominent "more like this" button. I'd rather do my first search and drill down, and it's clear Google has the categories and pre-calculated math to do so.&lt;/P&gt;&lt;P&gt;If I were out to game Google right now, I'd be building a very human-like browser (or using mechanical turk) to search for terms and click on my links. I suspect Google has greatly raised the priority of link-click in their reputation scheme, and gaming that system wouldn't be terribly hard. The benefit of blending personalization is hopefully I don't look like most mechanical turks.&lt;/P&gt;Bbulkow on January 3, 2011 12:18 PM &lt;P&gt;@Konrad: "To stay in your metaphor, it’s clearly time for a paradigm shift, a kind of Einstein of web ranking algorithms."&lt;/P&gt;&lt;P&gt;That's not staying in any metaphor, bud. It's all over the place. =)&lt;/P&gt;Tony on January 3, 2011 12:19 PM &lt;P&gt;I'd written about what is the intrinsic flaw of algorithmic search a while back, this may be of interest:&lt;/P&gt;&lt;P&gt;http://lesswrong.com/lw/28r/is_google_paperclipping_the_web_the_perils_of/&lt;/P&gt;AlexanderM on January 3, 2011 1:10 PM &lt;P&gt;Not meant as an insult: BUT it's very very difficult for Google to decide if a site is a content farm, a ripoff or "valid" content. How should Google decide if a link at stackoverflow is a link that comes from an SEO idiot or valid? If a link on del.icio.us/digg/reddit is valid or simple SEO?&lt;/P&gt;&lt;P&gt;But I'd agree that Google should react faster. Especially ripoffs that do not confirm to the cc-license could be detected (at least mostly) automatically.&lt;/P&gt;Ulrichvoss on January 3, 2011 1:13 PM &lt;P&gt;A social approach is the solution, but it MUST be designed so that it may not be gamed. The best way to do that is to allow me to vote up or down the search results and to allow me to blacklist/whitelist sites and to OPTIONALLY include my friends black and white lists.&lt;/P&gt;&lt;P&gt;It is this component of including friends, i.e. people I already trust, that ensures that it won't be gamed. If a friend of mine tries to game me, he/she won't be my friend for long. So it's self-policing.&lt;/P&gt;Charles Scalfani on January 3, 2011 1:15 PM &lt;P&gt;Shoot me a DM next time you need a case, I'll send you a good one for free, save you from needless Googling and Amazoning! :) http://www.myGearStore.com&lt;/P&gt;Benvanderbeek on January 3, 2011 1:17 PM &lt;P&gt;Google does a great job filtering spam in gmail. I'm not sure how important the "report spam" button is in this, but it is certainly somewhat satisfying to press it.&lt;/P&gt;&lt;P&gt;Where is the will to do the same thing for their search results?&lt;/P&gt;&lt;P&gt;I'd like to see a similar button in Chrome (for starters) for social rating of spammy websites. Other comments have noted that this would shift the goal posts to gaming the social rating system.&lt;/P&gt;&lt;P&gt;Maybe one solution to this would be to weight ratings by reputation. So Google detects that you are someone who rates spammy web sites highly, and devalues the rating you have applied to all other sites.&lt;/P&gt;Jasonharrop on January 3, 2011 1:18 PM &lt;P&gt;You're right on except for this one statement:&lt;BR&gt;"when was the last time you clicked through to a page that was nothing more than a legally copied, properly attributed Wikipedia entry encrusted in advertisements?"&lt;/P&gt;&lt;P&gt;On a growing number of search queries in Google, I'm seeing results from Ask.com that are Wikipedia articles with ads outranking the original Wikipedia posting.&lt;/P&gt;Jakeludington on January 3, 2011 1:26 PM &lt;P&gt;I've been running into a flood of these scraper sites in my search results, and more than anything I just want to exclude them. I would like to click a link next to the result to exclude that site from future searches; there's no content I'm interested in on that site that shouldn't show up as a hit on the original source.&lt;/P&gt;&lt;P&gt;Providing that feature might solve the problem for two reasons: I don't see the scraper sites so my searches are more to my liking (and google works for me so I come back to it,) and also, google can use a large number of explicit "exclusions" to affect the rankings. They could treat it as feedback, equivalent to users saying "this site is not relevant."&lt;/P&gt;Jim Rogers on January 3, 2011 1:51 PM &lt;P&gt;I actually have been hoping for a change in Google for a while. While Blekko shows promise, it isn't exactly what I was hoping for. And, though I know some of the following are a bit of a stretch now, they will be invaluable in the future.&lt;BR&gt;&lt;BR&gt;First, I want to be able to filter results from my search. (This is the opposite of what Bbulkow suggested), but his option would be good too) I want to be able to click something which says, "This site is bogus and should not be in this result set" or "That has nothing to do with what I am looking for". When I look for a legitimate answer for a question, I want to be able to tell Google to take about.com and shove it.&lt;BR&gt;I want to be able to search for symbols. I mean seriously, if I'm trying to find an email, why does it need to be changed from "foo@bar.com" to "foo bar com" (I'm a bit sensitive here, my last name is Allen-Poole).&lt;BR&gt;True Boolean logic. I want to look for ((this and that) or (that and another)) and not (some-other-thing). &lt;BR&gt;I want a means to search for linguistic constructs. For example, if I am looking up John Smith, I want to have a search which looks for the name (two words in close proximity, separated by a middle name or a middle initial). This is more than possible.&lt;BR&gt;I want regexp. That is just insane though. I don't expect to grep the web any time in the near (or maybe even distant) future.&lt;BR&gt;&lt;BR&gt;And what am I willing to trade? Time. I remember the 90's. I remember preferring AltaVista because its results were just slightly better and its logic seemed more reliable. But the amount of time I will save in proper results is invaluable and worth far more than whatever extra seconds that it takes crunching the numbers on their end (even extra minutes!). &lt;P&gt;Just think about this: it takes at least a second to read the title of a google link. It will take another couple of seconds to evaluate the text beneath. It is also not unreasonable for a website to take 3-5 seconds to load completely (though this can be optimized with tabbed browsing (though that can also decrease as the full &lt;title&gt; will not appear)). It takes an additional 3 seconds (minimum) for a human to read and parse a site, realize that this is not what you wanted, and then move the hand back to the mouse.&lt;/P&gt;&lt;P&gt;Now, if you were to have a questionable search (say, the dishwasher ratings example) and the first result is bad, the second and third result are maybes, the forth result is Amazon, and the fifth result is one which is relatively useful. This means that you will waste at least 5 * link-text + 4 * subtext + 2 * site-viewing to get to the result (assuming you stay on the good result). That makes a minimum of 19 seconds of &lt;B&gt;completely wasted time&lt;/B&gt; before getting to something truly useful. In this case probably more because you likely will stay on the mediocre results for a while longer than 3 seconds.&lt;/P&gt;&lt;P&gt;If Google were to give us these options, if it were to make our searches better, even if it were at 100% increase in search time, we would end up with a net benefit (I've not had too many searches take 10 seconds recently). The first point alone could net some extreme benefits and it reminds me of (http://en.wikipedia.org/wiki/Travelling_salesman_problem#Ant_colony_optimization) a solution to the travelling salesman problem. And, while this is still something which advertisers could use to our disadvantage, it would be a lot harder for them to do so, especially if these were implemented on a per-user basis.&lt;/P&gt;&lt;P&gt;Now, I know that I am a lowly voice in a sea of spam, but seriously. Google has the ability to implement this. I've read their specs and I think that, if they wanted, they could even make a way to grep the web. For the first task, it wouldn't even need to involve stored data -- it could all be tracked within one session. The next question is whether Google will care.&lt;/P&gt;&lt;P&gt;Amusingly, I feel it obligatory to add a link to http://allen-poole.com so that some day Google may look upon me and smile.&lt;/P&gt;Cwallenpoole.wordpress.com on January 3, 2011 1:52 PM &lt;P&gt;The only feature I need Google to implement right now is giving me the ability to blacklist sites in all my queries. I've long wished that I could blacklist experts-exchange, and with the proliferation of scraping sites over the last year, that desire has become even greater.&lt;/P&gt;&lt;P&gt;You could possibly make it social (my "friends" blacklist can be added to my own), but don't use blacklists to influence rankings. And no, don't do any peer votings for ranks either, as these will lead to more abuse and just be added to the list of SEO techniques.&lt;/P&gt;&lt;P&gt;This can't be that hard. I can already add "-site:experts-exchange.com" to my queries to remove the sites. Why can't it be an option in my google account setting to add that to all my searches.&lt;/P&gt;Evan Morgoch on January 3, 2011 1:55 PM &lt;P&gt;I find it hard to believe that this isn't intentional by Google, although I imagine the attention gathered by this article will change things dramatically.&lt;/P&gt;Davidsimbroglio on January 3, 2011 1:57 PM &lt;P&gt;Btw, there is an extension button for Google Chrome to report spam. It automates a part of filling in their report form. &lt;/P&gt;HenkPoley on January 3, 2011 2:10 PM &lt;P&gt;Its not you dude. Google is becoming the new Yahoo, one spam result at a time.&lt;/P&gt;&lt;P&gt;The sad part is without google the web is nothing. With all the technology improvements, nothing has really improved.&lt;/P&gt;&lt;P&gt;Its time to get VC out of tech and start building things that work.&lt;BR&gt;The web has turned into a get rich quick scheme.&lt;/P&gt;Rendion on January 3, 2011 2:47 PM &lt;P&gt;Hi Jeff, I passed on the examples that you sent back in December and the team is actively looking at improvements and changes they can make based on that feedback--thanks for sending it.&lt;/P&gt;&lt;P&gt;I was curious about the link to "Google, Google, Why Hast Thou Forsaken the Manolo?" and so I checked that one out. It's true that our algorithms don't currently think that's a great site, so I looked into it more. The disclaimer says "Manolo the Shoeblogger is not Mr. Manolo Blahnik." It's a *different* Manolo in the shoe industry.&lt;/P&gt;&lt;P&gt;So I picked a url, let's say http://basement.shoeblogs.com/category/bedding/ . Pretty much every post looked like "buy this type of bedding," usually with an affiliate link. And over on the right-hand side are links like "Shop hassle free and buy unique Duvet Covers at thecompanystore.com" that look an awful lot to us like paid links that pass PageRank.&lt;/P&gt;&lt;P&gt;I support the right of this blogger to put whatever they want on their domain, but I also support Google's right to decide how to rank our search results, and I don't think we should be obligated to rank that site highly.&lt;/P&gt;&lt;P&gt;I appreciated the rest of your post and it's safe to say that people inside Google are discussing it and how we can do better.&lt;/P&gt;Matt Cutts on January 3, 2011 3:03 PM &lt;P&gt;I'm no expert but what about taking the new syndication-source and original-source meta tags a step further.&lt;/P&gt;&lt;P&gt;Original content can be pinged, timestamped etc. w these tags. Webmaster tools could be used to report sites that are outranking the original content. Database would verify and adjust rankings.&lt;/P&gt;&lt;P&gt;Rewrites etc. would still happen but should help clean things up a bit in addition to giving content producers (and Google) an easier way of dealing with this problem.&lt;/P&gt;Kevin_Szprychel on January 3, 2011 3:41 PM &lt;P&gt;This looks pretty inevitable.&lt;/P&gt;&lt;P&gt;Two aspects come to mind:&lt;/P&gt;&lt;P&gt;1) It's an algorithm not human thought that's at work here. That gives an arms-race, the dark-part-of-SEO will catch up even if they started out pretty dumb.&lt;/P&gt;&lt;P&gt;2) Google makes it's money from adverts. A site that has a lot of adverts is working for Google. I really can't imagine them stamping on such sites like they're bugs. For me some of them are just that bugs, so we have a disconnect! In the absence of a published algorithm (even if it needs updating daily or more often) this sort of suspicion can't be resolved.&lt;/P&gt;&lt;P&gt;Human judged content (DMOZ anyone!) looks like an answer. Many times I look at what "social" delivers I shudder. A great average of everybody, it seems to me, is not the answer.&lt;/P&gt;&lt;P&gt;Maybe the web just needs to fracture. Personal control over how your own search works, sharing data with people who's opinions you respect, sites that work your way, less rubbish, less time waste, more productivity.&lt;/P&gt;&lt;P&gt;We could end up with different worlds, as sketched in some SciFi books for a long time. Those who live on the web, consuming, following, never creating. Those who disconnect, think for themselves enough that they deliver new and valuable work.&lt;/P&gt;&lt;P&gt;The web has altered our lives. It's time those who care get back into the loop. Control your web so that your life is yours, not a side-effect of a cacaphony of "important" web companies.&lt;/P&gt;Mike Gale on January 3, 2011 4:03 PM &lt;P&gt;Seems to me that relying purely on content for indexing isn't going to work any more. Each web site comes from a hierarchical division of address blocks. The existence of a "bad" web site within a given address block can and should impair the score of every other web site within that address block, to a lesser degree as we ascend the address block hierarchy. The same concept should be applied to registrars.&lt;/P&gt;&lt;P&gt;In other words, if my ISP hosts a lot of spam sites or there are a lot of them in my address block, my site is going to take a penalty, regardless of its content. I therefore have an incentive to seek out a reputable ISP, and reputable ISPs have a very solid reason to push out spam sites.&lt;/P&gt;&lt;P&gt;Eradicating this trash means making it harder and harder for it to find a "home". I can't think of a better way to do that than to have ISPs actively working on the problem, to retain their wider customer base. If they don't have a wider customer base, and it's all spam? Page ranks from that ISP will snuggle up to each other at the bottom of the pit.&lt;/P&gt;&lt;P&gt;The basic problem here is that its too hard to keep adapting like crazy to all the ways of restructuring content, times all the possible web sites. The number of ISPs and address blocks is, however, entirely tractable for this kind of problem.&lt;/P&gt;&lt;P&gt;Of course, this can punish entirely innocent web sites, until the system as a whole shakes itself out. It would be nice to have this particular omelette be break-free, but I don't see how to do that.&lt;/P&gt;Ross Judson on January 3, 2011 4:12 PM &lt;P&gt;I use Bing at work and Google at home (don't ask) and as odd as it is, I do get better results with Bing.&lt;/P&gt;Craig Deubler on January 3, 2011 4:21 PM &lt;P&gt;There was an algorithmic thing back in 2006 that included TrustRank. While it wasn't exactly a social recommendation type of thing, it did distribute GoogleJuice based on links from trusted sources.&lt;/P&gt;&lt;P&gt;http://weblogs.asp.net/jgalloway/archive/2006/01/11/435076.aspx&lt;/P&gt;&lt;P&gt;If there's an element of TrustRank in the current algorithms, it seems like that probably needs both a reset and a higher weighting.&lt;/P&gt;Jongalloway on January 3, 2011 5:06 PM &lt;P&gt;@Matt Cutts&lt;/P&gt;&lt;P&gt;I can see you took the time to read, analyze and post a comment. That's very decent of you. Unfortunately I can also see you only addressed Jeff, ignored any comments from commenters in here and approached the matter purely as a ranking issue.&lt;/P&gt;&lt;P&gt;Since Google Search is meant to be a service to the "user who searches" and not a service to the "user who publishes", I'm unsatisfied by your comment. But not surprised.&lt;/P&gt;Mario Figueiredo on January 3, 2011 5:18 PM &lt;P&gt;The whole PageRank conundrum reminds me of the parable in Gödel Escher Bach about the phonograph that breaks when you play a specific well designed record. GEB was referring to incompleteness but it's an equally good metaphor for computer security and quality-algorithms like PageRank.&lt;/P&gt;&lt;P&gt;If there's sufficient motivation to find your algorithm's weak points and exploit them, it's going to happen. Complicated algorithms just require more complicated and better designed inputs. &lt;/P&gt;Justin Scheiner on January 3, 2011 5:19 PM &lt;P&gt;Hi Mario, it's actually my 11 year anniversary this week. I'm out of town with my wife, so I only have limited time to slip away and post responses. Suffice it to say that plenty of people in Google have read this article and the other articles Jeff mentioned, and lots of people will be discussing what we need to do next to improve things.&lt;/P&gt;Matt Cutts on January 3, 2011 5:28 PM &lt;P&gt;@Matt Cutts&lt;/P&gt;&lt;P&gt;Yes, Manolo the Shoeblogger's site is like a lot of fashion blogs, in that it has decent number of affiliate links. &lt;/P&gt;&lt;P&gt;However, you didn't answer the central question posed by the Manolo in the post you've referenced, "why are the scrapers ranking higher than the original content?"&lt;/P&gt;&lt;P&gt;You, and others at Google, have harped on for years about the need to produce interesting and original content, and yet, if a site which produces plenty of original content doesn't throw exactly the right levers in Google's Rube Goldberg system, you'll preference a dozen content scrapers over it. &lt;/P&gt;&lt;P&gt;Manolo is very well known among fashion people and in the fashion press, in fact he pretty much invented the Fashion Blog...&lt;/P&gt;&lt;P&gt;http://en.wikipedia.org/wiki/Fashion_blog#Early_fashion_blogs &lt;/P&gt;&lt;P&gt;So, again, why should the content scrapers who are stealing his work be ranked higher than he is?&lt;/P&gt;Del Davis on January 3, 2011 5:54 PM &lt;P&gt;Lets hope they do and things do get improved, Matt. There's been a growing disconnect between Google Search and its users for the past... couple of years, I'd say. To the point that previously very rare statements like "Google search engine isn't good anymore" are becoming more prevalent. Something that would be unthinkable before.&lt;/P&gt;&lt;P&gt;Being that this is also the period in which Google introduced the most relevant new features and changes to the search engine UI since its inception, maybe it's time (and excuse me the bluntness) Google realizes that may not be what users actually require the most.&lt;/P&gt;&lt;P&gt;I'm prepared to accept also we are simply a non representative minority. But I do seem to witness a growing cry of protest. With alternative search engines taking their place in the market offering competitive possibilities, all care is not enough. Remember how Google itself rose.&lt;/P&gt;&lt;P&gt;And my congratulations, BTW!&lt;/P&gt;Mario Figueiredo on January 3, 2011 5:57 PM &lt;P&gt;Like it was said way upthread... I see this as a manifestation of the Windows/Mac malware thing. All the bad guys are optimizing their dark SEO for Google, not Bing. If they decided to focus on Bing, given time to catch up to their extensive knowledge of Google internals, the same would happen to our bingy buddy. &lt;/P&gt;&lt;P&gt;A thought: does Google factor in domain registration time to its algorithm? This seems like a reasonably accurate heuristic for tracking original content vs. scrapers. Obviously a "reused" scraper domain would be the problem.&lt;/P&gt;0xabad1dea on January 3, 2011 7:01 PM &lt;P&gt;I remember seeing this auction on flippa a while back:&lt;BR&gt;https://flippa.com/auctions/102189/1-iPhone-case-site-11kmonth-profits--2-million--pageviewsmonth&lt;/P&gt;&lt;P&gt;Thats the number one search result for "iphone 4 case" above apple, above amazon...crazy. Their auction description gives more detail on their seo efforts.&lt;/P&gt;&lt;P&gt;I troll AM forums like wickedfire where I often find insightful threads like overstock dominating the SERPs for very generic keywords. Why is the #1 result for "watches" "luggage" "crib sets" Overstock? arent there more deserving and relevant results? is google and overstock profit sharing?&lt;BR&gt;http://www.wickedfire.com/shooting-shit/111865-fuck-overstock.html&lt;/P&gt;Bryan on January 3, 2011 7:04 PM &lt;P&gt;As a web developer and SEO enthusiast, I've been increasingly surprised at how hard it is to find anything on Google anymore. This holiday season was particularly frustrating. After three or four attempts to find a Tiffany's bracelet, I gave up and went over to Bing, where I actually found several pages of relevant content to choose from. &lt;/P&gt;&lt;P&gt;One of my professors in college told about some theory (can't remember the name right now) where as you try and narrow down your hypothesis to get more and more specific, at some point, you actually become less and less effective and what you're trying to achieve. He used the visualization of an hourglass. As you narrow your results, you get to a finite point (the actual apex where the sand drops into the next chamber), after which point you get further away from what you're trying to achieve.&lt;/P&gt;&lt;P&gt;To me, this is where Google is right now. They're trying WAY too hard to continue to generate revenue while delivering the most personalized, specific results to the user. People are catching on and their gaming the system, without penalty. The fact is Google is broken and it will take a while before it's fixed. &lt;/P&gt;Crash Override on January 3, 2011 7:25 PM &lt;P&gt;Well, my blog / site is a lot smaller than yours, and I have put zero effort so far into SEO, but I get very little traffic from search. Most of my traffic comes from Twitter, Hacker News and DZone, with DZone being the biggest contributor.&lt;/P&gt;&lt;P&gt;In any event, I do think you're right about the content farms and other "spam" clogging Google. It seems we need some kind of reverse Turing Test. A *person* can easily tell a chatbot from a human conversation partner, but can a few cubic miles of MapReduce engines?&lt;/P&gt;&lt;P&gt;Well, unless you count sports reporting, that is. ;-)&lt;/P&gt;&lt;P&gt;http://borasky-research.net/2010/12/30/sure-why-not-five-predictions-for-2011/&lt;/P&gt;Znmeb on January 3, 2011 11:00 PM &lt;P&gt;Really useful article,, thanks google chrome..&lt;/P&gt;&lt;P&gt;Indian Sarees&lt;/P&gt;sarees on January 3, 2011 11:17 PM &lt;P&gt;I have been disturbed by Google for sometime and in actual fact never use it as a search engine. From a hidden program installer on my computer to the new Google chrome which outright says its keeping all and I mean all your information on a cloud. It wont even let you download programs. I also noticed recently that Microsoft gave the makers of a game information with regards to how many players were playing the game for the month as well as how long they played it. Seems to me every iota of privacy is disappearing. Quite frankly it scares me silly that people continue to believe it will do no harm. What if the USA Government or some other controlling force demand the info be handed over? The same with the new Apple patent with the application they intend putting in your phones? There is really only one person you can trust with your personal information and that is yourself. I am not a scare monger but I have seen what harm a dictator can do. The only way to keep yourself and your information safe is to totally keep it off the net.&lt;/P&gt;Nicki on January 4, 2011 12:02 AM &lt;P&gt;When I have a programming problem, I google for '{error message} {platform}', get the useless results, and then google for '{error message} {platform} stackoverflow' and i get a lot of good SO results and nothing else. In that respect, the system works, but yeah - you guys are missing out on a hell of a lot of good traffic.&lt;/P&gt;John Senner on January 4, 2011 12:10 AM &lt;P&gt;Internet would be a much better place if we finally deploy some cryptography based ranking/kudos solution. I don't know -- like http://www.bitcoin.org/ but for rankings. Something that would made SEO impossible at all.&lt;/P&gt;dpc on January 4, 2011 1:09 AM &lt;P&gt;Social search will work until the minute it wont work anymore. It' won't take long before spammers and scrapers find a way to beat the system like they managed to beat algoritmic search engines.&lt;/P&gt;&lt;P&gt;It's allow more easy to beat a social sistem than a algorithmic one. I'm just saying, humans like to see the dancing bunies.&lt;/P&gt;Pop Catalin on January 4, 2011 2:00 AM &lt;P&gt;+1 to personal website blacklists: I've felt a need for them for years. If I take the time to click a link, and understand that a website is somewhere I never wish to come again, I would like to be able to leverage that investment.&lt;/P&gt;&lt;P&gt;+1 also to being able to "follow" other people's blacklists. It would be very dangerous, though, to make the stats about following public: it would probably create a gravity effect towards the most followed blacklisters, who could then become too powerful - and be tempted to monetize that power, as it happens on many social networks. This should be of interest to Google - it would also allow them to have better social graph data.&lt;/P&gt;&lt;P&gt;If enough "trust communities" will grow, this should also lower the incentive to game the system, making SEO-only websites less lucrative.&lt;/P&gt;&lt;P&gt;Talking about the &lt;B&gt;scrappers&lt;/B&gt;, there are two very different situations here. The first one is where the content is Creative Common (or similar) and legitimately reproduced. In this case, there is no reason why Google should automatically give the first publisher a better ranking: if some of the scrappers published it in a "better" (whatever the metrics) way for the searcher, why shouldn't it get a higher placement? It would be very nice, though, if Google aggregated the similar pages, like it does in news: it is very annoying when you click several copycat links in a search.&lt;/P&gt;&lt;P&gt;The other case is when someone steals the copyrighted content. This should definitely be penalized, and in theory it should be the law to do so. Considering the reality of things, though, it would also be very much in the interest of Google to help the original content producers protect themselves - giving them an incentive to produce even more good content. Considering how fast, and how often they crawl the web, Google could very often find who really published first, and if there were a meta tag about the copyright and license, it could at least warn the original publisher, if not find a way to penalize the stealer.&lt;/P&gt;Daniele Mazzini on January 4, 2011 2:39 AM &lt;P&gt;I think what this shows is that over the long term, Search as we know it is broken. &lt;/P&gt;&lt;P&gt;The only way out will be "hybrid curation" -- basically back to the Yahoo model at the highest level -- with algorithmic results (ala Google) into the depths of the curated high level web sites.&lt;/P&gt;&lt;P&gt;Amazon is a great place to research products even if you don't shop there because there is curation and great reviews.&lt;/P&gt;&lt;P&gt;[dc]&lt;/P&gt;Dave Chapin on January 4, 2011 3:32 AM &lt;P&gt;well Matt C did say thatgoogle had taken resource away from some aspects of antispam and that would be returing this year.&lt;/P&gt;Hauntingthunder.wordpress.com on January 4, 2011 3:54 AM &lt;P&gt;One of the biggest flaws of Google is that it gives way too much importance to domain names. If you search for 'iphone 4 case' you see plenty of websites like iphone4case.com, getiphonecase.com, iphone4gcasereview.com, www.iphone-4g-case.net, www.4iphonecases.com etc. I don't understand why domain name is such an important criteria for ranking search results. That needs an immediate fix.&lt;/P&gt;Vasuadiga on January 4, 2011 4:27 AM &lt;P&gt;Interesting article. My responses to a couple of the comments:&lt;/P&gt;&lt;P&gt;First: "[...] where the content is Creative Common (or similar) and legitimately reproduced. In this case, there is no reason why Google should automatically give the first publisher a better ranking: if some of the scrappers published it in a "better" (whatever the metrics) way for the searcher, why shouldn't it get a higher placement?"&lt;/P&gt;&lt;P&gt;As a consumer I would rather reward (with traffic) the content creators for making knowledge available to mankind than I would the scrapers who have not generated anything new. By doing this, I assume, I am encouraging them to continue to create content - looking at the scrapers instead is less likely to have that effect. So, the scrapers are by definition not "better" and if the metrics think they are then the metrics are broken.&lt;/P&gt;&lt;P&gt;Second point: the categorisation into "social" and "algorithmic" search seems to me terminologically inexact when a key element of the "algorithmic" search is which sites have incoming links from other people. If those links are put there by people, that's a pretty social algorithm ;-) Perhaps the distinction would better be drawn between "anonymous" and "personal social" search.&lt;BR&gt;&lt;/P&gt;Coruskate on January 4, 2011 5:23 AM &lt;P&gt;@Vasuadiga&lt;/P&gt;&lt;P&gt;Well, it really isn't the domain name that is influencing the results. Along with that domain there's a legion of SEO techniques that are the actual responsible for the website placement. There never was, and still there isn't, any reason to believe the domain name factors in a website rank. Neither it would make any sense. What happens instead is that a domain name like iphone4case.com facilitates the creation of a link anchor text that may be more relevant to Google's algorithms (it is believed that a link anchor text is important).&lt;/P&gt;&lt;P&gt;So with a domain like that, the owner is effectively creating a commercial name that goes like "iPhone 4 Case". Contrast that with the same business, had it been named mobileshell.com. When someone links to their business, the link anchor text and surrounding text could read as:&lt;/P&gt;&lt;P&gt;- Find your iPhone cases at [u]iPhone 4 Case[/u]&lt;BR&gt;- Find your iPhone cases at [u]Mobile Shell[/u]&lt;/P&gt;&lt;P&gt;On the first case, both commercial name and anchor text accurately reflect the business, whereas the more creative second option will however produce an anchor text that doesn't. So when searching for the company name, "Mobile Shell" may produce a lot of false positives with links to the military or engineering areas, whereas "iPhone 4 Cases" will not. On the other hand, when searching for the more generic term "iPhone cases", the first company is at an advantage because there's a real chance that the vast majority of anchor text that link to their website include these exact terms (the plural form is largely ignored by google).&lt;/P&gt;Mario Figueiredo on January 4, 2011 5:26 AM &lt;P&gt;Have you tried Googling "sugar bowl" lately? Very misleading first listing.&lt;/P&gt;StarTrekRedneck on January 4, 2011 6:15 AM &lt;P&gt;How does Bing fare in all this??&lt;BR&gt;Is Bing equally scraper-infested??&lt;/P&gt;&lt;P&gt;Should and could Google and Bing et al. create scraper blacklists similar to anti-spam blacklists??&lt;/P&gt;&lt;P&gt;I have not yet experienced this scraping etc. -- are such issues related to how general or specific are one's search terms??&lt;/P&gt;&lt;P&gt;Thank you, Tom&lt;/P&gt;Tom Lyczko on January 4, 2011 6:23 AM &lt;P&gt;Crowdsourcing is the answer, IMO. If there's one thing Google has, it's a lot of users. Whatever happened to SearchWiki (http://googleblog.blogspot.com/2008/11/searchwiki-make-search-your-own.html)? It had a pleasant user interface, well-integrated with the results. I feel that such a mechanism, with a reputation system of some sort (perhaps subscribing to weighting results as edited by trusted groups of users) could drastically improve search result quality.&lt;/P&gt;Goran Zec on January 4, 2011 6:50 AM &lt;P&gt;From google perspective :&lt;BR&gt;How about letting users vote to bury sites that just copy content?&lt;/P&gt;&lt;P&gt;From web browsers perspective:&lt;BR&gt;How about making an plugin to preprocess google result filtering out sites on a black list?&lt;/P&gt;&lt;P&gt;From a user perspective:&lt;BR&gt;Use alternatives to google (yahoo, bing, etc), the less people use google, the more google is forced to improve. Google replaced yahoo, but it can be replaced if they don't hear their users. &lt;/P&gt;Ricardo Santos on January 4, 2011 6:58 AM &lt;P&gt;@Scott Willeke, Thanks! I installed that blacklist plugin. I've been wanting such an extension for some time: https://chrome.google.com/extensions/detail/ddgjlkmkllmpdhegaliddgplookikmjf&lt;/P&gt;&lt;P&gt;I want to acknowledge Google as an innovative company that almost single-handedly made the world wide web useful. As of last year they'd crawled over 1 trillion unique URLs, an astounding amount of noise to sift through. I admire their engineering ethos and feel their business largely adheres to "don't be evil". &lt;/P&gt;&lt;P&gt;That said, there is a real, serious problem with result quality. Google is a victim of its own success. The ecosystem they created is so profitable that it requires Google to spend inordinate time (possibly 50% of engineering?) keeping webmasters honest. Pick your metaphor -- traders gaming the stock market or bacteria growing antibiotic resistant -- bad websites are out-evolving Google.&lt;/P&gt;&lt;P&gt;Ranking knowledge has become ubiquitous, and sadly knowledge of gaming an engine has become more important to content sites that writing valid, expert content. It's not just the spammers, malware sites, and scraper sites writing worthless keyword stuffed content and buying links. &lt;/P&gt;&lt;P&gt;Google also made a deal with the McContent devil, Demand Media: http://techcrunch.com/2009/12/13/the-end-of-hand-crafted-content/&lt;/P&gt;&lt;P&gt;Demand buys up search queries and pays writers a paltry sum (dollars) to write poorly-researched content on subject areas they often have little to no experience in. Demand makes a few ad dollars per article, with traffic exclusively driven by search (I've never met anyone who goes directly to eHow.com to browse.) In turn, Google takes a cut of Adwords dollars. In the short run, Google's bottom line looks better, especially on a Youtube site they've had trouble monetizing. Demand runs eHow, but you'll equally vapid content on Q/A sites Wikia, Yahoo Answers. &lt;/P&gt;&lt;P&gt;Google needs to respond or their flagship search will suffer. The solution will be complex and multifaceted. In addition to small, incremental changes, I think Google will need to make some seismic ones. Google will face cries of injustice from "content producers" in the gray areas, but they need to stand tough. &lt;/P&gt;&lt;P&gt;I run SEO program at a large US media organization, NPR. From the beginning, we've stayed above board - fixing coding issues, worked on syndication, and trained our writers on the very basics. We write first for humans. That ensures that Google crawls us adequately, but we do lose traffic to sites that out-SEO us, legitimately or otherwise. My long view is that this current state of search is not sustainable, and any efforts we spend beyond the basics are at the expense of other products we can build.&lt;/P&gt;&lt;P&gt;It's easy for my organization to take this tack, however, because we're a well known brand and we can focus on other channels, such as social media and viral sites. Content producers should think about the tradeoffs they make when going broke for SEO -- it's impossible to quantify the traffic you don't get from Facebook/Twitter when you water down your content.&lt;BR&gt;&lt;/P&gt;Javaun on January 4, 2011 9:11 AM &lt;P&gt;More comments» &lt;/P&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.codinghorror.com/blog/2011/01/trouble-in-the-house-of-google.html" target="_blank" rel="nofollow"&gt;View the original article here&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-725076783612265097?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/725076783612265097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=725076783612265097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/725076783612265097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/725076783612265097'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2011/03/trouble-in-house-of-google.html' title='Trouble In the House of Google'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-5757502635709827427</id><published>2011-03-21T16:58:00.005+05:00</published><updated>2011-03-21T16:59:35.664+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Overflow'/><category scheme='http://www.blogger.com/atom/ns#' term='Exchange'/><category scheme='http://www.blogger.com/atom/ns#' term='Stack'/><category scheme='http://www.blogger.com/atom/ns#' term='company'/><title type='text'>Stack Overflow (the company) is now Stack Exchange</title><content type='html'> &lt;P&gt;The snack room at Stack Exchange got a wee upgrade today:&lt;/P&gt;&lt;P&gt;&lt;IMG border=0 alt="" src="C:\Program Files\ABS\Auto Blog Samurai\data\Rizwan's BLOG\Joel\"&gt;&lt;/P&gt;&lt;P&gt;Find out why (and read to the end to find out how to get your own StackExchange sticker) at the Stack Overflow Blog.&lt;/P&gt;&lt;BR clear=all&gt;&lt;BLOCKQUOTE class=textmessage&gt;&lt;IMG border=0 align=right src="/hginit.png"&gt; Have you been wondering about Distributed Version Control? It has been a huge productivity boon for us, so I wrote Hg Init, a Mercurial tutorial—check it out! &lt;/BLOCKQUOTE&gt;&lt;P&gt;You’re reading Joel on Software, stuffed with years and years of completely raving mad articles about software development, managing software teams, designing user interfaces, running successful software companies, and rubber duckies. &lt;/P&gt;&lt;P&gt;I’m Joel Spolsky, co-founder of Fog Creek Software, a New York company that proves that you can treat programmers well and still be highly profitable. Programmers get private offices, free lunch, and work 40 hours a week. Customers only pay for software if they’re delighted. We make FogBugz, an enlightened bug tracker designed to help great teams develop brilliant software, Kiln, which simplifies source control and code review, and Fog Creek Copilot, which makes remote desktop control easy. I’m also the co-founder of Stack Overflow. &lt;/P&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.joelonsoftware.com/items/2011/03/09.html" target="_blank" rel="nofollow"&gt;View the original article here&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-5757502635709827427?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/5757502635709827427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=5757502635709827427' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5757502635709827427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5757502635709827427'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2011/03/stack-overflow-company-is-now-stack.html' title='Stack Overflow (the company) is now Stack Exchange'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-6434230167116337300</id><published>2011-03-21T16:58:00.004+05:00</published><updated>2011-03-21T16:59:34.090+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jewish'/><category scheme='http://www.blogger.com/atom/ns#' term='Learning'/><category scheme='http://www.blogger.com/atom/ns#' term='Exchange'/><category scheme='http://www.blogger.com/atom/ns#' term='Stack'/><title type='text'>Stack Exchange for Jewish Life and Learning</title><content type='html'> &lt;P&gt;&lt;IMG border=0 alt="" src="/09jewishsite.jpg" width=220 height=250&gt;&lt;/P&gt;&lt;P&gt;It seems like Stack Exchange is the perfect platform for questions about Jewish observance. After all, most of the Talmud reads just like Stack Overflow: a question, followed by multiple answers, usually with the highest ranking answer appearing first. The number of questions is infinite. &lt;/P&gt;&lt;P&gt;If you would be interested in participating in such a thing, please commit to the proposal today.&lt;/P&gt;&lt;BR clear=all&gt;&lt;BLOCKQUOTE class=textmessage&gt;&lt;IMG border=0 align=right src="/hginit.png"&gt; Have you been wondering about Distributed Version Control? It has been a huge productivity boon for us, so I wrote Hg Init, a Mercurial tutorial—check it out! &lt;/BLOCKQUOTE&gt;&lt;P&gt;You’re reading Joel on Software, stuffed with years and years of completely raving mad articles about software development, managing software teams, designing user interfaces, running successful software companies, and rubber duckies. &lt;/P&gt;&lt;P&gt;I’m Joel Spolsky, co-founder of Fog Creek Software, a New York company that proves that you can treat programmers well and still be highly profitable. Programmers get private offices, free lunch, and work 40 hours a week. Customers only pay for software if they’re delighted. We make FogBugz, enlightened project management software for bug tracking, Kiln, which provides distributed version control and code reviews, and Fog Creek Copilot, which makes remote desktop support easy. I’m also the co-founder of Stack Overflow. &lt;/P&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.joelonsoftware.com/items/2010/12/09.html" target="_blank" rel="nofollow"&gt;View the original article here&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-6434230167116337300?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/6434230167116337300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=6434230167116337300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/6434230167116337300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/6434230167116337300'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2011/03/stack-exchange-for-jewish-life-and.html' title='Stack Exchange for Jewish Life and Learning'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-1562809224089355467</id><published>2011-03-21T16:58:00.003+05:00</published><updated>2011-03-21T16:59:32.375+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Questions'/><category scheme='http://www.blogger.com/atom/ns#' term='Wikipedia'/><title type='text'>The Wikipedia of Long Tail Programming Questions</title><content type='html'> &lt;P&gt;“Have you ever noticed how certain questions come up again and again on Stack Overflow sites?”&lt;/P&gt;&lt;P&gt;— From The Wikipedia of Long Tail Programming Questions, over on the Stack Overflow blog.&lt;/P&gt;&lt;BR clear=all&gt;&lt;BLOCKQUOTE class=textmessage&gt;&lt;IMG border=0 align=right src="/hginit.png"&gt; Have you been wondering about Distributed Version Control? It has been a huge productivity boon for us, so I wrote Hg Init, a Mercurial tutorial—check it out! &lt;/BLOCKQUOTE&gt;&lt;P&gt;You’re reading Joel on Software, stuffed with years and years of completely raving mad articles about software development, managing software teams, designing user interfaces, running successful software companies, and rubber duckies. &lt;/P&gt;&lt;P&gt;I’m Joel Spolsky, co-founder of Fog Creek Software, a New York company that proves that you can treat programmers well and still be highly profitable. Programmers get private offices, free lunch, and work 40 hours a week. Customers only pay for software if they’re delighted. We make FogBugz, an enlightened bug tracker designed to help great teams develop brilliant software, Kiln, which simplifies source control and code review, and Fog Creek Copilot, which makes remote desktop control easy. I’m also the co-founder of Stack Overflow. &lt;/P&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.joelonsoftware.com/items/2011/01/05.html" target="_blank" rel="nofollow"&gt;View the original article here&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-1562809224089355467?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/1562809224089355467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=1562809224089355467' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/1562809224089355467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/1562809224089355467'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2011/03/wikipedia-of-long-tail-programming.html' title='The Wikipedia of Long Tail Programming Questions'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-6268867963161569041</id><published>2011-03-21T16:58:00.002+05:00</published><updated>2011-03-21T16:59:08.644+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Overflow'/><category scheme='http://www.blogger.com/atom/ns#' term='Careers'/><category scheme='http://www.blogger.com/atom/ns#' term='Stack'/><title type='text'>Careers 2.0 (by Stack Overflow)</title><content type='html'> &lt;P&gt;One day, you’ll be telling your grandchildren about getting a programming job, version 1.0. You would send a “resume” to a “recruiter.” It included all kinds of silly information required by the esoteric resume ritual (foreign languages spoken, whether or not you play ultimate Frisbee, Microsoft-veteran status). This so-called “information” was utterly useless at determining whether you could program or not, but if you spelled everything right and used suitable fonts, you could come in for a day of interviews at which you would be asked to perform mundane programming tasks on a whiteboard.&lt;/P&gt;&lt;P&gt;Careers 2.0 is here!&lt;/P&gt;&lt;P&gt;&lt;IMG border=0 alt="" src="C:\Program Files\ABS\Auto Blog Samurai\data\Rizwan's BLOG\Joel\"&gt;&lt;/P&gt;&lt;BR clear=all&gt;&lt;BLOCKQUOTE class=textmessage&gt;&lt;IMG border=0 align=right src="/hginit.png"&gt; Have you been wondering about Distributed Version Control? It has been a huge productivity boon for us, so I wrote Hg Init, a Mercurial tutorial—check it out! &lt;/BLOCKQUOTE&gt;&lt;P&gt;You’re reading Joel on Software, stuffed with years and years of completely raving mad articles about software development, managing software teams, designing user interfaces, running successful software companies, and rubber duckies. &lt;/P&gt;&lt;P&gt;I’m Joel Spolsky, co-founder of Fog Creek Software, a New York company that proves that you can treat programmers well and still be highly profitable. Programmers get private offices, free lunch, and work 40 hours a week. Customers only pay for software if they’re delighted. We make FogBugz, an enlightened bug tracking and software development tool, Kiln, a distributed source control system that will blow your socks off if you’re stuck on Subversion, and Fog Creek Copilot, which makes remote desktop access easy. I’m also the co-founder of Stack Overflow. &lt;/P&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.joelonsoftware.com/items/2011/02/23.html" target="_blank" rel="nofollow"&gt;View the original article here&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-6268867963161569041?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/6268867963161569041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=6268867963161569041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/6268867963161569041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/6268867963161569041'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2011/03/careers-20-by-stack-overflow.html' title='Careers 2.0 (by Stack Overflow)'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-8979572196146715943</id><published>2011-03-21T16:58:00.001+05:00</published><updated>2011-03-21T16:59:06.992+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FogBugzKiln'/><title type='text'>FogBugz/Kiln Demo</title><content type='html'> &lt;P&gt;If you weren’t able to make it to the FogBugz/Kiln world tour, a video of my presentation is up now on YouTube.&lt;/P&gt;&lt;P&gt;(If you have a high bandwidth connection, try the “720p” option, which shows the screen more clearly.)&lt;/P&gt;&lt;BR clear=all&gt;&lt;BLOCKQUOTE class=textmessage&gt;&lt;IMG border=0 align=right src="/hginit.png"&gt; Have you been wondering about Distributed Version Control? It has been a huge productivity boon for us, so I wrote Hg Init, a Mercurial tutorial—check it out! &lt;/BLOCKQUOTE&gt;&lt;P&gt;You’re reading Joel on Software, stuffed with years and years of completely raving mad articles about software development, managing software teams, designing user interfaces, running successful software companies, and rubber duckies. &lt;/P&gt;&lt;P&gt;I’m Joel Spolsky, co-founder of Fog Creek Software, a New York company that proves that you can treat programmers well and still be highly profitable. Programmers get private offices, free lunch, and work 40 hours a week. Customers only pay for software if they’re delighted. We make FogBugz, enlightened project management software for bug tracking, Kiln, which provides distributed version control and code reviews, and Fog Creek Copilot, which makes remote desktop support easy. I’m also the co-founder of Stack Overflow. &lt;/P&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.joelonsoftware.com/items/2011/02/03.html" target="_blank" rel="nofollow"&gt;View the original article here&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-8979572196146715943?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/8979572196146715943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=8979572196146715943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/8979572196146715943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/8979572196146715943'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2011/03/fogbugzkiln-demo.html' title='FogBugz/Kiln Demo'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-176458353298482752</id><published>2011-03-21T16:58:00.000+05:00</published><updated>2011-03-21T16:59:05.009+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Overflow'/><category scheme='http://www.blogger.com/atom/ns#' term='recap'/><category scheme='http://www.blogger.com/atom/ns#' term='Stack'/><title type='text'>Stack Overflow 2010 recap</title><content type='html'> &lt;P&gt;(reposted from the Stack Overflow blog)&lt;/P&gt;&lt;P&gt;2010 was an absolutely amazing year here at Stack Overflow. We grew from 7 million visitors to over 16 million, putting us in Quantcast’s top 400. We raised $6 million in venture capital, and we went from three full time employees to 27. We built a 7500 square foot office in New York, and we launched a ton of new features and sites, like Stack Exchange, a network of 33 Q&amp;A sites on diverse topics from cooking to computer science. Stack Exchange grew 51% in December alone. Wow.&lt;/P&gt;&lt;P&gt;The expert Q&amp;A model that Stack Overflow pioneered is really working. The statistic I’m proudest of is the percentage of questions that get a good answer, over 80% (and many of the new Stack Exchange sites have 100% answer rates!)&lt;/P&gt;&lt;P&gt;The true measure of success for any Internet company is how often people come up to me in swank hotel lobbies and offer to buy me meals, let me use their corporate jet, etc. But since there is a great deal of disagreement as to how to measure that, we track a reasonable proxy called “eyeballs,” on the theory that if a site is useful, people will load it up in their browsers and eyeball it.&lt;/P&gt;&lt;P&gt;&lt;IMG class="alignnone size-full wp-image-6764" title=01traffic alt="Traffic graph for Stack Overflow 2011" src="/24-01traffic.png" width=600 height=383&gt;&lt;/P&gt;&lt;P&gt;Traffic to Stack Overflow grew 131% in 2010, to 16.6 million global monthly uniques. *Uniques* are counted by cookies, so the number of human beings is less. We also measure the number of page views (top level pages loaded, which doesn’t count images and supporting files), which has similarly grown from 31.8 million per month to 72.8 million per month, i.e. 129% growth.&lt;/P&gt;&lt;P&gt;Based on the number of people who do come up to us in hotel lobbies, we’re pretty sure that ALL the programmers in the world use Stack Overflow. (Source: completely made up. But seriously, when was the last time you met a programmer who didn’t use “El Stack”?) In order to keep growing and making the Internet more awesome, we have to expand into new subject areas, like Molecular Biology and Harley Davidson Belt Buckles. That’s what Stack Exchange is all about. Stack Exchange growth is insane. In six short months, we’ve gone from zero to 1.5 million monthly visitors, growing 51% in December.&lt;/P&gt;&lt;P&gt;&lt;IMG class="alignnone size-full wp-image-6763" title=02stackextraffic alt="2011 Traffic stats for Stack Exchange network - unique visitors" src="/24-02stackextraffic.png" width=600 height=390&gt;&lt;/P&gt;&lt;P&gt;&lt;IMG class="alignright size-full wp-image-6762" title=03movie alt="Scene from Office Space" src="/24-03movie.png" width=420 height=302&gt;If, as planned, we continue growing at 51% a month, we will be bigger than Facebook in 15 months. We’re ALREADY bigger than ocn.ne.jp (No, I’ve never heard of that either. But we’re bigger). Jeff and I are already planning who will play us in the Aaron Sorkin movie. (Tyler Labine and Zac Efron, obviously.)&lt;/P&gt;&lt;P&gt;Now, obviously, all this TRAFFIC isn’t worth a thing if people aren’t getting answers to their questions. That’s why our favorite thing to measure is “percent of questions answered.” And not just any answer will do, either: to count a question as “answered”, either the original poster has to accept the answer, or a third party has to upvote the answer. This is where Stack Overflow really shines compared to other Q&amp;A sites: we actually get questions answered. Three of our sites actually have 100% answer rates!&lt;/P&gt;&lt;P&gt;&lt;IMG class="alignnone size-full wp-image-6761" title=04pctanswered alt="Chart of percent of questions answered for each site" src="/24-04pctanswered.png" width=600 height=486&gt;&lt;/P&gt;&lt;P&gt;Last summer, we relaunched Stack Exchange as a democratically-driven network of sites on topics chosen by our users. Some of these sites are directly related to programming (for example, Game Development), but some are quite far afield, from English Language toCooking.&lt;/P&gt;&lt;P&gt;&lt;IMG class="alignnone size-full wp-image-6760" title=05newsites alt="Screenshots of some new Stack Exchange sites" src="/24-05newsites.png" width=600 height=268&gt;&lt;/P&gt;&lt;P&gt;We call it the Stack Exchange network, and at StackExchange.com you’ll find a directory of all of them, along with some hot questions, statistics, leaderboards, and other tools so that you can follow the sites and tags that you’re interested in.&lt;/P&gt;&lt;P&gt;We learned a long time ago that the only way to get questions answered promptly is to have a critical mass of knowledgeable users, so we have an onerous process called Area 51 where sites are proposed, discussed, and voted on. If a proposed site doesn’t have critical mass, we just won’t create it. Even if it does get created, it has to maintain a certain level of traffic and quality or we’ll close it down.&lt;/P&gt;&lt;P&gt;So far, 13 sites have gone all the way through the Area 51 process and launched. Dozens more are already in beta. Hundreds more are in active discussion and will launch when they reach a critical mass of interested participants.&lt;/P&gt;&lt;P&gt;The development team has been knocking out new features at a constant pace. They built an amazing web-based chat system, and we’ve added literally hundreds of new features and improvements to the core Stack Overflow engine which we roll out continuously.&lt;/P&gt;&lt;P&gt;At the beginning of the year, Stack Overflow LLC was just three developers working from home. In the spring, we raised $6 million in venture capital from Union Square Ventures and a long list of celebrity angel investors, which allowed us to expand rapidly. We hired a team of great people, including several of the high-reputation users that you know from Stack Overflow.&lt;/P&gt;&lt;P&gt;&lt;IMG class="alignnone size-full wp-image-6759" title=06team alt="the Stack Overflow team - portraits" src="/24-06team.png" width=600 height=460&gt;&lt;/P&gt;&lt;P&gt;&lt;IMG class="alignright size-full wp-image-6758" title=07notpunyon alt="" src="/24-07notpunyon.png" width=316 height=221&gt;We now have community managers, a sales team, two full time system administrators, and Very Important Administrative Overhead like myself, but most importantly, we have a great team of developers, in New York and around the world, building the next generation of cool features, like the important “wheel of blame” feature, which we can run at any time to calculate precisely who is responsible for anything that went wrong. (Contrary to popular belief, it’s not always Jason Punyon.)&lt;/P&gt;&lt;P&gt;To make room for all these people, or, at least, those who live in New York, we rented a 7500 square foot, class A, super-elite batcave in New York and then fixed it up to be nice, with cool furniture including Aeron chairs and height-adjustable desks, and lots of glass to bring views and daylight deep into the batcave. And of course, we have private offices with a half dozen gigantic 453-inch monitors for each developer. And there’s an amazingly cool Star Trek couch. Does your company have a Star Trek Couch? *I didn’t think so.* We also have Rovio, a little robot that our remote developers can use to visit the office “virtually.” (There. I said “virtually.” Are you happy now?)&lt;/P&gt;&lt;P&gt;&lt;IMG class="alignnone size-full wp-image-6757" title=08office alt="Floorplan of Stack Overflow office" src="/24-08office.png" width=600 height=463&gt;&lt;/P&gt;&lt;P&gt;Overall 2010 has been a real breakout year for Stack Overflow, which is now the largest programmer website in the world (source: me) and the best, fastest-growing Q&amp;A website in the world (source: also me). We’ve got an incredible team firing on all cylinders, so we’re really looking forward to 2011.&lt;/P&gt;&lt;BR clear=all&gt;&lt;BLOCKQUOTE class=textmessage&gt;&lt;IMG border=0 align=right src="/hginit.png"&gt; Have you been wondering about Distributed Version Control? It has been a huge productivity boon for us, so I wrote Hg Init, a Mercurial tutorial—check it out! &lt;/BLOCKQUOTE&gt;&lt;P&gt;You’re reading Joel on Software, stuffed with years and years of completely raving mad articles about software development, managing software teams, designing user interfaces, running successful software companies, and rubber duckies. &lt;/P&gt;&lt;P&gt;I’m Joel Spolsky, co-founder of Fog Creek Software, a New York company that proves that you can treat programmers well and still be highly profitable. Programmers get private offices, free lunch, and work 40 hours a week. Customers only pay for software if they’re delighted. We make FogBugz, an enlightened bug tracking and software development tool, Kiln, a distributed source control system that will blow your socks off if you’re stuck on Subversion, and Fog Creek Copilot, which makes remote desktop access easy. I’m also the co-founder of Stack Overflow. &lt;/P&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.joelonsoftware.com/items/2011/01/24.html" target="_blank" rel="nofollow"&gt;View the original article here&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-176458353298482752?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/176458353298482752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=176458353298482752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/176458353298482752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/176458353298482752'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2011/03/stack-overflow-2010-recap.html' title='Stack Overflow 2010 recap'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-6795748147172272237</id><published>2011-03-21T16:57:00.001+05:00</published><updated>2011-03-21T16:57:50.821+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='employer'/><title type='text'>Does your employer own your side projects?</title><content type='html'> &lt;P&gt;There’s a surprising amount of misinformation out there about whether software companies own the work that a programmer does in their spare time.&lt;/P&gt;&lt;P&gt;From my answer to the question on answers.onstartups.com:&lt;/P&gt;&lt;BLOCKQUOTE dir=ltr&gt;Being an employee of a high tech company whose product is intellectual means that you have decided that you want to sell your intellectual output.&lt;/BLOCKQUOTE&gt;&lt;P&gt;Read the whole thing here:&lt;/P&gt;&lt;BLOCKQUOTE dir=ltr&gt;If I'm working at a company, do they have intellectual property rights to the stuff I do in my spare time?&lt;/BLOCKQUOTE&gt;&lt;BR clear=all&gt;&lt;BLOCKQUOTE class=textmessage&gt;&lt;IMG border=0 align=right src="/hginit.png"&gt; Have you been wondering about Distributed Version Control? It has been a huge productivity boon for us, so I wrote Hg Init, a Mercurial tutorial—check it out! &lt;/BLOCKQUOTE&gt;&lt;P&gt;You’re reading Joel on Software, stuffed with years and years of completely raving mad articles about software development, managing software teams, designing user interfaces, running successful software companies, and rubber duckies. &lt;/P&gt;&lt;P&gt;I’m Joel Spolsky, co-founder of Fog Creek Software, a New York company that proves that you can treat programmers well and still be highly profitable. Programmers get private offices, free lunch, and work 40 hours a week. Customers only pay for software if they’re delighted. We make FogBugz, an enlightened bug tracking and software development tool, Kiln, a distributed source control system that will blow your socks off if you’re stuck on Subversion, and Fog Creek Copilot, which makes remote desktop access easy. I’m also the co-founder of Stack Overflow. &lt;/P&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.joelonsoftware.com/items/2011/02/11.html" target="_blank" rel="nofollow"&gt;View the original article here&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-6795748147172272237?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/6795748147172272237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=6795748147172272237' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/6795748147172272237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/6795748147172272237'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2011/03/does-your-employer-own-your-side.html' title='Does your employer own your side projects?'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-1277188557139243090</id><published>2010-05-04T17:15:00.001+05:00</published><updated>2010-05-04T17:15:40.528+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Payoneer'/><category scheme='http://www.blogger.com/atom/ns#' term='Payoneer Blocked'/><title type='text'>Why Payoneer Blocked Pakistan The Truth</title><content type='html'>Link: http://syedaqeel.com/2010/05/why-payoneer-blocked-pakistan-the-truth/ &lt;br /&gt;&lt;br /&gt;Like every other Payoneer user from Pakistan I became insane after reading support email. However after coming to senses I had done some research about why Payoneer blocked Pakistan. Many readers left comments on earlier post about Payoneer ban for doing protest to Payoneer.&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--&lt;br /&gt;google_ad_client = "pub-4157202987411249";&lt;br /&gt;/* 300x250, created 04/05/10 */&lt;br /&gt;google_ad_slot = "7007416523";&lt;br /&gt;google_ad_width = 300;&lt;br /&gt;google_ad_height = 250;&lt;br /&gt;//--&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&lt;br /&gt;src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Friends you do not need to protest Payoneer, don’t even have to blame them and they can’t help us in this situation. They have to follow policies of US regularity authorities and its what they are doing.&lt;br /&gt;&lt;br /&gt;Reason for this ban is Pakistani law makers.  On March 26th, 2010 Pakistan’s Anti-Money Laundering ordinance of 2008 has expired. So right now Pakistan is a lawless country without any anti-money laundering and anti-terrorist funding laws. Due to that Asia Pacific Group on Financial Action Task Force (FATF) has put Pakistan in category III of risk countries for financial transactions.&lt;br /&gt;&lt;br /&gt;Due to absence of proper anti-money laundering laws in Pakistan US government issued new regulations for its financial institutions. This is why Payoneer has included Pakistan in banned countries.&lt;br /&gt;&lt;br /&gt;This is a negligence at end of Pakistani law makers who failed to renew the existing ordinance or approve the new anti-money laundering bill which is already approved by national assembly. According to a story published in TheNews Pakistani senate had a meeting on March 18th in which this law was put forward but the senate “had some other important affairs” to deal with so this  law discussion was moved forward to future senate meeting.&lt;br /&gt;&lt;br /&gt;    Chairman Senate Standing Committee on Finance Senator Ahmed Ali said the committee under his chairmanship approved the bill in great haste with conditions that this bill would be tabled again within one year as the committee wanted to bring certain improvements in it. However, he deplored that their hard work could not bring the desired fruit as the Senate was prorogued without passing such an important bill.&lt;br /&gt;&lt;br /&gt;    “Despite our hectic work, the Senate did not pass this bill,” he said and concluded that there was still sufficient time available till March 26 and the government should summon the session of upper house on immediate basis in order to pass this bill in the supreme national interest.&lt;br /&gt;&lt;br /&gt;No one is our enemy, not Payoneer, not even US government but our own government and law makers. Right now Pakistan officially do not have any anti-money laundering laws. Kudos!&lt;br /&gt;&lt;br /&gt;Link: http://syedaqeel.com/2010/05/why-payoneer-blocked-pakistan-the-truth/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-1277188557139243090?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/1277188557139243090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=1277188557139243090' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/1277188557139243090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/1277188557139243090'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2010/05/why-payoneer-blocked-pakistan-truth_04.html' title='Why Payoneer Blocked Pakistan The Truth'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-5448183103536353046</id><published>2010-05-04T16:29:00.001+05:00</published><updated>2010-05-04T16:31:51.179+05:00</updated><title type='text'>Payoneer Blocks its Master Cards for Pakistan</title><content type='html'>By Aamir Attaa · Tuesday, May 4, 2010 5 Comments&lt;br /&gt;http://propakistani.pk/2010/05/04/payoneer-blocks-its-master-cards-for-pakistan/&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Payoneer, which allows its customers to receive their payments onto a Debit MasterCard that is reloadable through western union, internet (via credit/debit cards) and other similar means, just announced that all Payoneer cards will be blocked for transactions in Pakistan.&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--&lt;br /&gt;google_ad_client = "pub-4157202987411249";&lt;br /&gt;/* 300x250, created 15/04/10 */&lt;br /&gt;google_ad_slot = "7501846009";&lt;br /&gt;google_ad_width = 300;&lt;br /&gt;google_ad_height = 250;&lt;br /&gt;//--&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&lt;br /&gt;src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Payoneer in an email to its customers said that card holders residing in countries listed by the US government as having strategic Anti Money Laundering (AML) deficiencies won’t be able to use Payoneer debit master cards.&lt;br /&gt;&lt;br /&gt;Other countries on the list include: Angola, Ecuador, Ethiopia, Turkmenistan and Sao Tome and Principe.&lt;br /&gt;&lt;br /&gt;If your card is in use in one of the countries listed, it is strongly recommended to use all of your funds by May 31, 2010.&lt;br /&gt;&lt;br /&gt;Payoneer was widely used by freelancers to charge their customer. They used to give a url where customers could pay the bills using their credit cards.&lt;br /&gt;&lt;br /&gt;This is going to be another blow for countless freelancers of Pakistan, where receiving payments from foreign personals is already very tough.&lt;br /&gt;&lt;br /&gt;Payoneer sent following email to their customers in Pakistan:&lt;br /&gt;&lt;br /&gt;    Dear Customer,&lt;br /&gt;&lt;br /&gt;    Due to a change in requirements from our regulators, as of June 1, 2010 Payoneer cards will be blocked for transactions in the countries listed by the US government as having strategic Anti Money Laundering (AML) deficiencies. This change will affect card usage in the following countries: Angola, Ecuador, Ethiopia, Pakistan, Turkmenistan and Sao Tome and Principe.&lt;br /&gt;&lt;br /&gt;    If your card is in use in one of the countries listed, we encourage you to use all funds by May 31, while transactions are still possible in these countries.&lt;br /&gt;&lt;br /&gt;    Please note that beyond May 31 your card will continue to be fully functional in all countries not banned by the US government, and we will be happy to load payments to the card without any change.&lt;br /&gt;&lt;br /&gt;    We apologize for the inconvenience and hope that the Payoneer card will continue to provide you with valuable service.&lt;br /&gt;&lt;br /&gt;    Sincerely,&lt;br /&gt;    Payoneer Customer Support&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-5448183103536353046?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/5448183103536353046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=5448183103536353046' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5448183103536353046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5448183103536353046'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2010/05/payoneer-blocks-its-master-cards-for.html' title='Payoneer Blocks its Master Cards for Pakistan'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-5787241187109186439</id><published>2010-05-04T16:11:00.002+05:00</published><updated>2010-05-04T16:16:36.367+05:00</updated><title type='text'>Why Payoneer Blocked Pakistan – The Truth</title><content type='html'>Like every other Payoneer user from Pakistan I became insane after reading support email. However after coming to senses I had done some research about why Payoneer blocked Pakistan. Many readers left comments on earlier post about Payoneer ban for doing protest to Payoneer.&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--&lt;br /&gt;google_ad_client = "pub-4157202987411249";&lt;br /&gt;/* 300x250, created 04/05/10 */&lt;br /&gt;google_ad_slot = "7007416523";&lt;br /&gt;google_ad_width = 300;&lt;br /&gt;google_ad_height = 250;&lt;br /&gt;//--&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&lt;br /&gt;src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Friends you do not need to protest Payoneer, don’t even have to blame them and they can’t help us in this situation. They have to follow policies of US regularity authorities and its what they are doing.&lt;br /&gt;&lt;br /&gt;Reason for this ban is Pakistani law makers.  On March 26th, 2010 Pakistan’s Anti-Money Laundering ordinance of 2008 has expired. So right now Pakistan is a lawless country without any anti-money laundering and anti-terrorist funding laws. Due to that Asia Pacific Group on Financial Action Task Force (FATF) has put Pakistan in category III of risk countries for financial transactions.&lt;br /&gt;&lt;br /&gt;Due to absence of proper anti-money laundering laws in Pakistan US government issued new regulations for its financial institutions. This is why Payoneer has included Pakistan in banned countries.&lt;br /&gt;&lt;br /&gt;This is a negligence at end of Pakistani law makers who failed to renew the existing ordinance or approve the new anti-money laundering bill which is already approved by national assembly. According to a story published in TheNews Pakistani senate had a meeting on March 18th in which this law was put forward but the senate “had some other important affairs” to deal with so this  law discussion was moved forward to future senate meeting.&lt;br /&gt;&lt;br /&gt;    Chairman Senate Standing Committee on Finance Senator Ahmed Ali said the committee under his chairmanship approved the bill in great haste with conditions that this bill would be tabled again within one year as the committee wanted to bring certain improvements in it. However, he deplored that their hard work could not bring the desired fruit as the Senate was prorogued without passing such an important bill.&lt;br /&gt;&lt;br /&gt;    “Despite our hectic work, the Senate did not pass this bill,” he said and concluded that there was still sufficient time available till March 26 and the government should summon the session of upper house on immediate basis in order to pass this bill in the supreme national interest.&lt;br /&gt;&lt;br /&gt;No one is our enemy, not Payoneer, not even US government but our own government and law makers. Right now Pakistan officially do not have any anti-money laundering laws. Kudos!&lt;br /&gt;&lt;br /&gt;Link: http://syedaqeel.com/2010/05/why-payoneer-blocked-pakistan-the-truth/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-5787241187109186439?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/5787241187109186439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=5787241187109186439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5787241187109186439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5787241187109186439'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2010/05/why-payoneer-blocked-pakistan-truth.html' title='Why Payoneer Blocked Pakistan – The Truth'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-5203139070836502651</id><published>2010-05-04T16:09:00.001+05:00</published><updated>2010-05-04T16:09:48.468+05:00</updated><title type='text'>Payoneer Pakistan Users Can No Longer Use Payoneer – Change in Regulations</title><content type='html'>This is a very bad news for every freelancer and web entrepreneur who was completely relying on Payoneer. In this email one question remains unanswered that users will still be able to receive funds and use Payoneer cards to make transactions to US merchants. I had asked this question to Payoneer support and now waiting for their reply. Will keep my readers updated at this situation.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://syedaqeel.com/wp-content/uploads/2010/05/Payoneer-Card.jpg" alt="Payoneer Card" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--&lt;br /&gt;google_ad_client = "pub-4157202987411249";&lt;br /&gt;/* 300x250, created 15/04/10 */&lt;br /&gt;google_ad_slot = "7501846009";&lt;br /&gt;google_ad_width = 300;&lt;br /&gt;google_ad_height = 250;&lt;br /&gt;//--&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&lt;br /&gt;src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dear Customer,&lt;br /&gt;&lt;br /&gt;Due to a change in requirements from our regulators, as of June 1, 2010 Payoneer cards will be blocked for transactions in the countries listed by the US government as having strategic Anti Money Laundering (AML) deficiencies. This change will affect card usage in the following countries: Angola, Ecuador, Ethiopia, Pakistan, Turkmenistan and Sao Tome and Principe.&lt;br /&gt;&lt;br /&gt;If your card is in use in one of the countries listed, we encourage you to use all funds by May 31, while transactions are still possible in these countries.&lt;br /&gt;&lt;br /&gt;Please note that beyond May 31 your card will continue to be fully functional in all countries not banned by the US government, and we will be happy to load payments to the card without any change.&lt;br /&gt;&lt;br /&gt;We apologize for the inconvenience and hope that the Payoneer card will continue to provide you with valuable service.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Please feel free to use our Contact Us page for any additional questions. Please do not reply to this e-mail.&lt;br /&gt;&lt;br /&gt;Sincerely,&lt;br /&gt;&lt;br /&gt;Payoneer Customer Support&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-5203139070836502651?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/5203139070836502651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=5203139070836502651' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5203139070836502651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5203139070836502651'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2010/05/payoneer-pakistan-users-can-no-longer.html' title='Payoneer Pakistan Users Can No Longer Use Payoneer – Change in Regulations'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-1509126146410787751</id><published>2009-05-20T16:37:00.004+06:00</published><updated>2009-05-20T17:02:45.056+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Custom Images for FCK'/><category scheme='http://www.blogger.com/atom/ns#' term='DNN'/><category scheme='http://www.blogger.com/atom/ns#' term='Upload imgaes in DNN'/><category scheme='http://www.blogger.com/atom/ns#' term='FCK Editor'/><category scheme='http://www.blogger.com/atom/ns#' term='upload FCK editor images'/><title type='text'>Upload user specific images in FCK Editor of DNN</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Question:&lt;/span&gt;I would like to be able to let users upload their pictures through the editor "FCKConfig.ImageUpload=true" but i want each user that logs in to be able to upload to their assigned areas for instance, if user1 logs in then when he uploads a picture he would upload it to the user1 in the web server and then when he browses for all pictures using fckeditor he would only be able to see the pictures under the user1 folder.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Answer:&lt;/span&gt;If you want to be able to set the file browsing and uploading path on the fly for each user or group you will have to use the Application("FCKeditor:UserFilesPath") variable for FCKeditor on the Page_Init event. You can also use the Session("FCKeditor:UserFilesPath"), as a matter of fact, that is what the fckeditor documentation suggests. However, with dotnetnuke i couldnt get it to work properly using the session variable so instead I used the "Application" call, i think that this is the equivalent of using the web.config except that you are doing it dynamically. Anyhow, below is an example of how I am doing it in my site, notice that I am just checking the user name for the current logged in user, I am not checking group memberships like you want:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Protected Sub Page_Init&lt;br /&gt;(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init&lt;br /&gt;         Try&lt;br /&gt;             Dim userCtrlr As New UserController&lt;br /&gt;             Dim user As UserInfo = userCtrlr.GetUser(PortalId, UserId)&lt;br /&gt;             Application("FCKeditor:UserFilesPath") =&lt;br /&gt;Page.ResolveUrl("~/Portals/" &amp;amp; PortalId.ToString &amp;amp; "/Userfiles/FlyerImgs/" &amp;amp;&lt;br /&gt;user.Username &amp;amp; "/")&lt;br /&gt;         Catch exc As Exception 'Module failed to load&lt;br /&gt;             ProcessModuleLoadException(Me, exc)&lt;br /&gt;         End Try&lt;br /&gt;     End Sub&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Make sure that you are using the "Page.ResolveUrl" otherwise the application will have problems converting the image path, and the image will not display properly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Ref: http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/127/threadid/158276/scope/posts/Default.aspx&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-1509126146410787751?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/127/threadid/158276/scope/posts/Default.aspx' title='Upload user specific images in FCK Editor of DNN'/><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/1509126146410787751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=1509126146410787751' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/1509126146410787751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/1509126146410787751'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2009/05/upload-user-specific-images-in-fck.html' title='Upload user specific images in FCK Editor of DNN'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-832488544708498296</id><published>2009-05-06T16:45:00.002+06:00</published><updated>2009-05-06T16:49:59.813+06:00</updated><title type='text'>Urdu textbox JS file</title><content type='html'>Download js file directly.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://justcsharp.googlepages.com/urdueditor.js"&gt;http://justcsharp.googlepages.com/urdueditor.js&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-832488544708498296?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/832488544708498296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=832488544708498296' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/832488544708498296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/832488544708498296'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2009/05/urdu-textbox-js-file.html' title='Urdu textbox JS file'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-4562366085359092903</id><published>2009-05-06T16:32:00.006+06:00</published><updated>2009-05-06T16:53:45.023+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='urdu'/><category scheme='http://www.blogger.com/atom/ns#' term='urdu textbox'/><category scheme='http://www.blogger.com/atom/ns#' term='urdu input'/><title type='text'>Urdu Textbox</title><content type='html'>&lt;span style="font-weight: bold;"&gt;JS file&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;a href="http://justcsharp.googlepages.com/urdueditor.js"&gt;http://justcsharp.googlepages.com/urdueditor.js&lt;/a&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Editor Initialization&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;Initialize Editor before textbox.&lt;br /&gt;&lt;br /&gt;&lt;div class="sourceRow"&gt;&lt;span class="sourceLine"&gt;&lt;/span&gt;&lt;span class="sourceRowText"&gt;initUrduEditor("");&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TextBox&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;input  type="text" onfocus="setEditor(this)" style="font-family: Urdu Naskh Asiatype; font-size: 14px;" id="Editor" name="Editor" lang="ur"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-4562366085359092903?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/4562366085359092903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=4562366085359092903' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/4562366085359092903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/4562366085359092903'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2009/05/urdu-textbox.html' title='Urdu Textbox'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-579314891206795887</id><published>2009-04-24T12:17:00.007+06:00</published><updated>2009-04-24T13:16:28.570+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IP'/><category scheme='http://www.blogger.com/atom/ns#' term='Block Access'/><category scheme='http://www.blogger.com/atom/ns#' term='MAC'/><category scheme='http://www.blogger.com/atom/ns#' term='Java Applets'/><category scheme='http://www.blogger.com/atom/ns#' term='MAC Address'/><title type='text'>Restrict Web Page access based on MAC / IP</title><content type='html'>This solution is a combination of .Net / Java applets. Java Applet is used to get the MAC from the client machine and then it is sent back to the server and there it will be used to restrict the client access or grant it access based on the ACL (Access Control List) defined in the XML.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java Applet to Get MAC Address : &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;import java.net.NetworkInterface;&lt;br /&gt;import java.net.SocketException;&lt;br /&gt;import java.util.Enumeration;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.applet.Applet;&lt;br /&gt;&lt;br /&gt;public class MacAddressApplet extends Applet&lt;br /&gt;{&lt;br /&gt;public static String sep = ":";&lt;br /&gt;public static String format = "%02X";&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* getMacAddress - return the first mac address found&lt;br /&gt;* separator - byte seperator default ":"&lt;br /&gt;* format - byte formatter default "%02X"&lt;br /&gt;*&lt;br /&gt;* @param ni - the network interface&lt;br /&gt;* @return String - the mac address as a string&lt;br /&gt;* @throws SocketException - pass it on&lt;br /&gt;*/&lt;br /&gt;public static String macToString( NetworkInterface ni ) throws SocketException&lt;br /&gt;{&lt;br /&gt; return macToString( ni, MacAddressApplet.sep,  MacAddressApplet.format );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* getMacAddress - return the first mac address found&lt;br /&gt;*&lt;br /&gt;* @param ni - the network interface&lt;br /&gt;* @param separator - byte seperator default ":"&lt;br /&gt;* @param format - byte formatter default "%02X"&lt;br /&gt;* @return String - the mac address as a string&lt;br /&gt;* @throws SocketException - pass it on&lt;br /&gt;*/&lt;br /&gt;public static String macToString( NetworkInterface ni, String separator, String format ) throws SocketException&lt;br /&gt;{&lt;br /&gt; byte mac [] = ni.getHardwareAddress();&lt;br /&gt;&lt;br /&gt; if( mac != null ) {&lt;br /&gt;     StringBuffer macAddress = new StringBuffer( "" );&lt;br /&gt;     String sep = "";&lt;br /&gt;     for( byte o : mac ) {&lt;br /&gt;         macAddress.append( sep ).append( String.format( format, o ) );&lt;br /&gt;         sep = separator;&lt;br /&gt;     }&lt;br /&gt;/* My extra Code for Vista*/&lt;br /&gt;if (macAddress.length ()! = 0)&lt;br /&gt;(&lt;br /&gt;  macAddress.toString return ();&lt;br /&gt;)&lt;br /&gt;/* End of patch*/&lt;br /&gt;     return macAddress.toString();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* getMacAddress - return the first mac address found&lt;br /&gt;*&lt;br /&gt;* @return the mac address or undefined&lt;br /&gt;*/&lt;br /&gt;public static String getMacAddress()&lt;br /&gt;{&lt;br /&gt; try {&lt;br /&gt;     Enumeration&lt;/span&gt;&lt;networkinterface&gt;&lt;span style="font-size:85%;"&gt; nis = NetworkInterface.getNetworkInterfaces();&lt;br /&gt;&lt;br /&gt;     // not all interface will have a mac address for instance loopback on windows&lt;br /&gt;     while( nis.hasMoreElements() ) {&lt;br /&gt;         String mac = macToString( nis.nextElement() );&lt;br /&gt;         if( mac != null )&lt;br /&gt;             return mac;&lt;br /&gt;     }&lt;br /&gt; } catch( SocketException ex ) {&lt;br /&gt;     System.err.println( "SocketException:: " + ex.getMessage() );&lt;br /&gt;     ex.printStackTrace();&lt;br /&gt; } catch( Exception ex ) {&lt;br /&gt;     System.err.println( "Exception:: " + ex.getMessage() );&lt;br /&gt;     ex.printStackTrace();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return "undefined";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* getMacAddressesJSON - return all mac addresses found&lt;br /&gt;*&lt;br /&gt;* @return a JSON array of strings (as a string)&lt;br /&gt;*/&lt;br /&gt;public static String getMacAddressesJSON()&lt;br /&gt;{&lt;br /&gt; try {&lt;br /&gt;     String macs [] = getMacAddresses();&lt;br /&gt;&lt;br /&gt;     String sep = "";&lt;br /&gt;     StringBuffer macArray = new StringBuffer( "['" );&lt;br /&gt;     for( String mac: macs ) {&lt;br /&gt;         macArray.append( sep ).append( mac );&lt;br /&gt;         sep = "','";&lt;br /&gt;     }&lt;br /&gt;     macArray.append( "']" );&lt;br /&gt;&lt;br /&gt;     return macArray.toString();&lt;br /&gt; } catch( Exception ex ) {&lt;br /&gt;     System.err.println( "Exception:: " + ex.getMessage() );&lt;br /&gt;     ex.printStackTrace();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return "[]";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* getMacAddresses - return all mac addresses found&lt;br /&gt;*&lt;br /&gt;* @return array of strings (mac addresses) empty if none found&lt;br /&gt;*/&lt;br /&gt;public static String [] getMacAddresses()&lt;br /&gt;{&lt;br /&gt; try {&lt;br /&gt;     Enumeration&lt;/span&gt;&lt;networkinterface&gt;&lt;span style="font-size:85%;"&gt; nis = NetworkInterface.getNetworkInterfaces();&lt;br /&gt;&lt;br /&gt;     ArrayList&lt;/span&gt;            &lt;string&gt;&lt;span style="font-size:85%;"&gt; macs = new ArrayList&lt;/span&gt;&lt;string&gt;&lt;span style="font-size:85%;"&gt;();&lt;br /&gt;     while( nis.hasMoreElements() ) {&lt;br /&gt;         String mac = macToString( nis.nextElement() );&lt;br /&gt;         // not all interface will have a mac address for instance loopback on windows&lt;br /&gt;         if( mac != null ) {&lt;br /&gt;             macs.add( mac );&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt;     return macs.toArray( new String[0] );&lt;br /&gt; } catch( SocketException ex ) {&lt;br /&gt;     System.err.println( "SocketException:: " + ex.getMessage() );&lt;br /&gt;     ex.printStackTrace();&lt;br /&gt; } catch( Exception ex ) {&lt;br /&gt;     System.err.println( "Exception:: " + ex.getMessage() );&lt;br /&gt;     ex.printStackTrace();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return new String[0];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* getMacAddresses - return all mac addresses found&lt;br /&gt;*&lt;br /&gt;* @param sep - use a different separator&lt;br /&gt;*/&lt;br /&gt;public static void setSep( String sep )&lt;br /&gt;{&lt;br /&gt; try {&lt;br /&gt;     MacAddressApplet.sep = sep;&lt;br /&gt; } catch( Exception ex ) {&lt;br /&gt;     //  don't care&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* getMacAddresses - return all mac addresses found&lt;br /&gt;*&lt;br /&gt;* @param format - the output format string for bytes that can be overridden default hex.&lt;br /&gt;*/&lt;br /&gt;public static void setFormat( String format )&lt;br /&gt;{&lt;br /&gt; try {&lt;br /&gt;     MacAddressApplet.format = format;&lt;br /&gt; } catch( Exception ex ) {&lt;br /&gt;     //  don't care&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void main( String... args )&lt;br /&gt;{&lt;br /&gt; System.err.println( " MacAddress = " + getMacAddress() );&lt;br /&gt;&lt;br /&gt; setSep( "-" );&lt;br /&gt; String macs [] = getMacAddresses();&lt;br /&gt;&lt;br /&gt; for( String mac : macs )&lt;br /&gt;     System.err.println( " MacAddresses = " + mac );&lt;br /&gt;&lt;br /&gt; setSep( ":" );&lt;br /&gt; System.err.println( " MacAddresses JSON = " + getMacAddressesJSON() );&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java Applet to Get OS Version :&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;import java.net.*;&lt;br /&gt;&lt;br /&gt;public class GetOSName extends java.applet.Applet {&lt;br /&gt;public String OSName;&lt;br /&gt;public String Vendor;&lt;br /&gt;public String URL;&lt;br /&gt;public String Version;&lt;br /&gt;public String OSArch;&lt;br /&gt;public String OSVersion;&lt;br /&gt;&lt;br /&gt;URL location;&lt;br /&gt;public void start() {&lt;br /&gt;  Vendor =  System.getProperty("java.vendor");&lt;br /&gt;  URL = System.getProperty("java.vendor.url");&lt;br /&gt;  Version = System.getProperty("java.version");&lt;br /&gt;  OSArch =  System.getProperty("os.arch");&lt;br /&gt;  OSName = System.getProperty("os.name");&lt;br /&gt;  OSVersion = System.getProperty("os.version");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getOSName() {&lt;br /&gt;OSName = System.getProperty("os.name");&lt;br /&gt;return OSName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The above two applets are used in the CheckAccess.aspx file to get the MAC Address and then the page will autopost back with the MAC Address to the server.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;CheckAccess.aspx File:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;In this file add both applets and onload of page call the following functions to get the MAC address and then postback that form back to the server.&lt;br /&gt;&lt;br /&gt;Add the both applets in the Page.&lt;br /&gt;&lt;br /&gt;  &amp;lt;!--[if !IE]&amp;gt; Firefox and others will use outer object --&amp;gt;&lt;br /&gt;  &amp;lt;embed type="application/x-java-applet"&lt;br /&gt;         name="macaddressapplet"&lt;br /&gt;         width="0"&lt;br /&gt;         height="0"&lt;br /&gt;         code="MacAddressApplet"&lt;br /&gt;         archive="macaddressapplet.jar"&lt;br /&gt;         pluginspage="http://java.sun.com/javase/downloads/index.jsp"&lt;br /&gt;         style="position:absolute; top:-1000px; left:-1000px;"&gt;&lt;br /&gt;      &amp;lt;noembed&amp;gt;&lt;br /&gt;      &amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;br /&gt;          &amp;lt;!----&amp;gt;&lt;br /&gt;          &amp;lt;object classid="clsid:CAFEEFAC-0016-0000-FFFF-ABCDEFFEDCBA"&lt;br /&gt;                  type="application/x-java-applet"&lt;br /&gt;                  name="macaddressapplet"&lt;br /&gt;                  style="position:absolute; top:-1000px; left:-1000px;"&lt;br /&gt;                  &amp;gt;&lt;br /&gt;              &amp;lt;param name="code" value="MacAddressApplet"&amp;gt;&lt;br /&gt;              &amp;lt;param name="archive" value="macaddressapplet.jar" &amp;gt;&lt;br /&gt;              &amp;lt;param name="mayscript" value="true"&amp;gt;&lt;br /&gt;              &amp;lt;param name="scriptable" value="true"&amp;gt;&lt;br /&gt;              &amp;lt;param name="width" value="0"&amp;gt;&lt;br /&gt;              &amp;lt;param name="height" value="0"&amp;gt;&lt;br /&gt;            &amp;lt;/object&amp;gt;&lt;br /&gt;      &amp;lt;!--[if !IE]&amp;gt; Firefox and others will use outer object --&amp;gt;&lt;br /&gt;      &amp;lt;/noembed&amp;gt;&lt;br /&gt;  &amp;lt;/embed&amp;gt;&lt;br /&gt;  &amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!--[if !IE]&amp;gt; Firefox and others will use outer object --&amp;gt;&lt;br /&gt;  &amp;lt;embed type="application/x-java-applet"&lt;br /&gt;         name="GetOSName"&lt;br /&gt;         width="0"&lt;br /&gt;         height="0"&lt;br /&gt;         code="GetOSName"&lt;br /&gt;         archive="GetOSName.jar"&lt;br /&gt;         pluginspage="http://java.sun.com/javase/downloads/index.jsp"&lt;br /&gt;         style="position:absolute; top:-1000px; left:-1000px;"&amp;gt;&lt;br /&gt;      &amp;lt;noembed&amp;gt;&lt;br /&gt;      &amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;br /&gt;          &amp;lt;!----&amp;gt;&lt;br /&gt;          &amp;lt;object classid="clsid:CAFEEFAC-0016-0000-FFFF-ABCDEFFEDCBA"&lt;br /&gt;                  type="application/x-java-applet"&lt;br /&gt;                  name="GetOSName"&lt;br /&gt;                  style="position:absolute; top:-1000px; left:-1000px;"&lt;br /&gt;                  &amp;gt;&lt;br /&gt;              &amp;lt;param name="code" value="GetOSName"&amp;gt;&lt;br /&gt;              &amp;lt;param name="archive" value="GetOSName.jar" &amp;gt;&lt;br /&gt;              &amp;lt;param name="mayscript" value="true"&amp;gt;&lt;br /&gt;              &amp;lt;param name="scriptable" value="true"&amp;gt;&lt;br /&gt;              &amp;lt;param name="width" value="0"&amp;gt;&lt;br /&gt;              &amp;lt;param name="height" value="0"&amp;gt;&lt;br /&gt;            &amp;lt;/object&amp;gt;&lt;br /&gt;      &amp;lt;!--[if !IE]&amp;gt; Firefox and others will use outer object --&amp;gt;&lt;br /&gt;      &amp;lt;/noembed&amp;gt;&lt;br /&gt;  &amp;lt;/embed&amp;gt;&lt;br /&gt;  &amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Script to Get MAC Address:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       var macs = {&lt;br /&gt;           getMacAddress : function()&lt;br /&gt;           {&lt;br /&gt;               document.macaddressapplet.setSep( "-" );&lt;br /&gt;               //alert( "Mac Address = " + document.macaddressapplet.getMacAddress() );&lt;br /&gt; var myText = document.getElementById("txt_Mac");&lt;br /&gt; myText.value = document.macaddressapplet.getMacAddress() ;&lt;br /&gt;&lt;br /&gt;           },&lt;br /&gt;&lt;br /&gt;           getMacAddressesJSON : function()&lt;br /&gt;           {&lt;br /&gt;               document.macaddressapplet.setSep( "-" );&lt;br /&gt;               document.macaddressapplet.setFormat( "%02x" );&lt;br /&gt;               var macs = eval( String( document.macaddressapplet.getMacAddressesJSON() ) );&lt;br /&gt;               var mac_string = "";&lt;br /&gt;               for( var idx = 0; idx &lt; addresses = " + mac_string );   var myText = document.getElementById(" value =" mac_string;" style="font-weight: bold;"&gt;Hidden Fields:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type="text" value="" id="txt_Mac" runat="server" /&amp;gt;&lt;br /&gt;&amp;lt;input type="text" value="" id="txt_OS" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Function to get MAC Adress depending on OS Version:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;function GetMACAddress()&lt;br /&gt;{&lt;br /&gt; var OSName = document.GetOSName.getOSName();&lt;br /&gt; var my_OS = document.getElementById("txt_OS");&lt;br /&gt; my_OS.value = OSName;&lt;br /&gt;if(OSName == "Windows XP")&lt;br /&gt;{&lt;br /&gt; macs.getMacAddress();&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt; macs.getMacAddressesJSON();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Auto Postback functions:&lt;/span&gt;&lt;br /&gt;           function SubmitForm()&lt;br /&gt;           {&lt;br /&gt;         var myText = document.getElementById("txt_Mac");&lt;br /&gt;        &lt;br /&gt;               if(myText.value.length &gt; 0)&lt;br /&gt;               {&lt;br /&gt;                   var jsVar = "http://localhost:2582/CheckAccess.aspx";&lt;br /&gt;                   __doPostBack('callPostBack', jsVar);&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;CS file:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      protected void Check_IP_MAC()&lt;br /&gt;       {&lt;br /&gt;           XPathDocument xpDoc = new XPathDocument("ACL XML File");&lt;br /&gt;           XPathNavigator xpNav = xpDoc.CreateNavigator();&lt;br /&gt;&lt;br /&gt;           //Gets the IP addresses from the file and compare it with the users IP&lt;br /&gt;&lt;br /&gt;           XPathExpression xpExpression = xpNav.Compile(@"/users/user/ip");&lt;br /&gt;           XPathNodeIterator xpIter = xpNav.Select(xpExpression);&lt;br /&gt;          &lt;br /&gt;           string _userIP = Request.UserHostAddress.ToString();&lt;br /&gt;           string _userMAC = txt_Mac.Value;&lt;br /&gt;         &lt;br /&gt;           bool _IPCheck = false;&lt;br /&gt;           bool _MACCheck = false;&lt;br /&gt;          &lt;br /&gt;           while (xpIter.MoveNext())&lt;br /&gt;           {&lt;br /&gt;&lt;br /&gt;               if (xpIter.Current.Value == _userIP)&lt;br /&gt;               {&lt;br /&gt;                   _IPCheck = true;&lt;br /&gt;               }&lt;br /&gt;&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;           //Gets the MAC addresses from the file and compare it with the users MAC&lt;br /&gt;&lt;br /&gt;           xpExpression = xpNav.Compile(@"/users/user/mac");&lt;br /&gt;           xpIter = xpNav.Select(xpExpression);&lt;br /&gt;          &lt;br /&gt;           while (xpIter.MoveNext())&lt;br /&gt;           {&lt;br /&gt;&lt;br /&gt;               if (xpIter.Current.Value == _userMAC)&lt;br /&gt;               {&lt;br /&gt;                   _MACCheck = true;&lt;br /&gt;               }&lt;br /&gt;&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;           //Sets the Session if the MAC / IP validates&lt;br /&gt;           if (_IPCheck == true &amp;amp;&amp;amp; _MACCheck == true)&lt;br /&gt;           {&lt;br /&gt;               Server.Transfer("WEB PAGE LANDING FILE");&lt;br /&gt;           }&lt;br /&gt;           else&lt;br /&gt;           {&lt;br /&gt;               Server.Transfer("ERROR FILE");&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;Ref: http://techdetails.blogmatrix.com/:entry:techdetails-2008-02-11-0000/ , http://www.spiration.co.uk/post/1186/Java%20detect%20brower,%20JVM%20vendor,%20Java%20version%20etc&lt;/span&gt;&lt;/string&gt;&lt;/string&gt;&lt;/networkinterface&gt;&lt;/networkinterface&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-579314891206795887?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/579314891206795887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=579314891206795887' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/579314891206795887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/579314891206795887'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2009/04/restrict-web-page-access-based-on-mac.html' title='Restrict Web Page access based on MAC / IP'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-723782410513339169</id><published>2008-12-23T12:42:00.001+05:00</published><updated>2008-12-23T12:42:27.038+05:00</updated><title type='text'>Support rich text with the Yahoo! User Interface Library</title><content type='html'>&lt;p&gt;During a recent project, my team's task was to redesign a Web page that utilized an ActiveX control as a rich text editor. One goal of the project was to replace the ActiveX control with a more standardized approach. We chose to use the rich text editor available with the &lt;a href="http://developer.yahoo.com/yui/index.html" target="_blank"&gt;Yahoo! User Interface (YUI) Library&lt;/a&gt;. This week I examine using the YUI Library's Rich Text Editor.&lt;/p&gt;  &lt;h2&gt;YUI Library&lt;/h2&gt; &lt;p&gt;The &lt;a href="http://articles.techrepublic.com.com/5100-3513-6100361.html" target="_blank"&gt;YUI Library&lt;/a&gt; is a set of utilities and controls in JavaScript, as well as CSS templates for building richly interactive Web applications using standard technologies such as DHTML, DOM scripting, and AJAX.&lt;/p&gt; &lt;p&gt;You can &lt;a href="http://sourceforge.net/project/downloading.php?group_id=165715&amp;amp;filename=yui_2.3.1.zip" target="_blank"&gt;download the YUI Library 2.3.1&lt;/a&gt; for free from SourceForge.net. The download allows you to install the libraries on a Web server. Another option is to use the library files directly from Yahoo! servers. Yahoo! provides an excellent overview of how to use its servers for applications implementing functionality via the YUI Library.&lt;/p&gt; &lt;h2&gt;Rich Text Editor&lt;/h2&gt; &lt;p&gt;A recent addition to the YUI Library is the Rich Text Editor. It is a user interface control that replaces the standard HTML textarea element. It allows for the rich formatting of text content, including common structural treatments like lists, formatting treatments like bold and italic text, and drag-and-drop inclusion and sizing of images.&lt;/p&gt; &lt;p&gt;A critical feature of the Rich Text Editor is its toolbar, which provides access to various features like text formatting, color choices, and so forth. You may choose which toolbar features to include in an implementation via scripting. In addition, the toolbar is extensible via a plug-in architecture so that advanced implementations can achieve a high degree of customization.&lt;/p&gt; &lt;h2&gt;Putting the Rich Text Editor to work&lt;/h2&gt; &lt;p&gt;If you want to use the Rich Text Editor, it requires a YUI Library CSS skin to properly render the control. The following YUI Library files (CSS and JavaScript source files) are necessary to use the Rich Text Editor. The following lines reference the files on the previously mentioned Yahoo! servers, but you may use a local installation as well.&lt;/p&gt; &lt;pre&gt;&amp;lt;!-- Skin CSS file --&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/assets/skins/sam/skin.css"&gt;http://yui.yahooapis.com/2.3.1/build/assets/skins/sam/skin.css&lt;/a&gt;&amp;quot;&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;!-- Utility Dependencies --&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/yahoo-dom-event/yahoo-dom-event.js"&gt;http://yui.yahooapis.com/2.3.1/build/yahoo-dom-event/yahoo-dom-event.js&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br&gt; &lt;br&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/element/element-beta-min.js"&gt;http://yui.yahooapis.com/2.3.1/build/element/element-beta-min.js&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br&gt; &lt;br&gt;&amp;lt;!-- Needed for Menus, Buttons and Overlays used in the Toolbar --&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;script src=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/container/container_core-min.js"&gt;http://yui.yahooapis.com/2.3.1/build/container/container_core-min.js&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;script src=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/menu/menu-min.js"&gt;http://yui.yahooapis.com/2.3.1/build/menu/menu-min.js&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;script src=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/button/button-beta-min.js"&gt;http://yui.yahooapis.com/2.3.1/build/button/button-beta-min.js&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;!-- Source file for Rich Text Editor--&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;script src=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/editor/editor-beta-min.js"&gt;http://yui.yahooapis.com/2.3.1/build/editor/editor-beta-min.js&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;  &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt;   &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The following base HTML is used to deliver the Rich Text Box, but you'll still need to add scripting to fully implement the control.&lt;/p&gt; &lt;pre&gt;&amp;lt;body class=&amp;quot;yui-skin-sam&amp;quot;&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;textarea name=&amp;quot;texteditor&amp;quot; id=&amp;quot;texteditor&amp;quot; cols=&amp;quot;50&amp;quot; rows=&amp;quot;10&amp;quot;&amp;gt; &lt;br&gt;&lt;br&gt;This text will be displayed in the text area. &lt;br&gt; &lt;br&gt;&amp;lt;/textarea&amp;gt;&amp;lt;/body&amp;gt;&lt;/pre&gt; &lt;p&gt;Now the cols and rows attributes of the HTML texarea element will be overridden by settings specified in the Rich Text Editor's script. The name assigned to the HTML textarea element is important, since it will be used in the JavaScript code when establishing the relationship between a textarea element and a Rich Text Editor.&lt;/p&gt; &lt;p&gt;Also, the class assigned to the HTML body element (yui-skin-sam) is used to visually format the Rich Text Editor control. This CSS skin is defined in the CSS file imported into the application (see previous list). The skin should be applied to the parent HTML element of the textarea element. In this case, the HTML body element is used, but it could be any element that contains the textarea.&lt;/p&gt; &lt;p&gt;Once the textarea has been defined along with the proper YUI Library files included in the page, the Rich Text Editor control must be rendered. The rendering is accomplished via JavaScript placed within the page. The script can be used to define various Rich Text Editor options such as the toolbar. As an example, I may use the following JavaScript to format our Rich Text Editor:&lt;/p&gt; &lt;pre&gt;var rtf = new YAHOO.widget.Editor(&amp;#39;texteditor&amp;#39;, { &lt;br&gt;&lt;br&gt;height: &amp;#39;300px&amp;#39;, &lt;br&gt;&lt;br&gt;width: &amp;#39;522px&amp;#39;}); &lt;br&gt;&lt;br&gt;rtf.render();&lt;/pre&gt; &lt;p&gt;This snippet establishes the height and width of the editor while declaring an instance of the Rich Text Editor. Also, it assigns the textarea called texteditor to the Rich Text Editor. The final line in the script actually causes the Rich Text Editor to display when it calls its render method.&lt;/p&gt; &lt;p&gt;When you use the Rich Text Editor control without any specifics about the toolbar, it results in the default behavior of including all toolbar features like text alignment, font face, font size, color, and so forth. You may choose to limit the toolbar options available to users.&lt;/p&gt; &lt;p&gt;The final example uses a Rich Text Editor, but the toolbar options are defined in the JavaScript code to render it. The following options are used:&lt;/p&gt; &lt;ul class="unIndentedList"&gt;&lt;li&gt;The toolbar options are defined in its own variable. This is later used to instantiate the editor.&lt;/li&gt;&lt;li&gt;A title is assigned to the editor via the toolbar's titlebar property.&lt;/li&gt;&lt;li&gt;The collapse property signals whether the user may collapse/hide the toolbar.&lt;/li&gt; &lt;li&gt;The buttons property allows you to define the buttons displayed in the toolbar. In this example, buttons are displayed for text formatting as well as selecting colors.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Once the toolbar options are defined, a Rich Text Editor object is instantiated with the toolbar variable passed to it along with the HTML textarea element. The final step is to render the control. A complete list of options is available in the &lt;a href="http://developer.yahoo.com/yui/docs/YAHOO.widget.Editor.html" target="_blank"&gt;YUI Library API documentation&lt;/a&gt;.&lt;/p&gt; &lt;pre&gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;title&amp;gt;Working with YUI Library Rich Text Editor&amp;lt;/title&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;!-- Skin CSS file --&amp;gt;   &lt;br&gt;&lt;br&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/assets/skins/sam/skin.css"&gt;http://yui.yahooapis.com/2.3.1/build/assets/skins/sam/skin.css&lt;/a&gt;&amp;quot; /&amp;gt;    &lt;br&gt; &lt;br&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/fonts/fonts-min.css"&gt;http://yui.yahooapis.com/2.3.1/build/fonts/fonts-min.css&lt;/a&gt;&amp;quot; /&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/container/assets/skins/sam/container.css"&gt;http://yui.yahooapis.com/2.3.1/build/container/assets/skins/sam/container.css&lt;/a&gt;&amp;quot; /&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/menu/assets/skins/sam/menu.css"&gt;http://yui.yahooapis.com/2.3.1/build/menu/assets/skins/sam/menu.css&lt;/a&gt;&amp;quot; /&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/button/assets/skins/sam/button.css"&gt;http://yui.yahooapis.com/2.3.1/build/button/assets/skins/sam/button.css&lt;/a&gt;&amp;quot; /&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/editor/assets/skins/sam/editor.css"&gt;http://yui.yahooapis.com/2.3.1/build/editor/assets/skins/sam/editor.css&lt;/a&gt;&amp;quot; /&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;!-- Utility Dependencies --&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/yahoo-dom-event/yahoo-dom-event.js"&gt;http://yui.yahooapis.com/2.3.1/build/yahoo-dom-event/yahoo-dom-event.js&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/element/element-beta-min.js"&gt;http://yui.yahooapis.com/2.3.1/build/element/element-beta-min.js&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;!-- Needed for Menus, Buttons and Overlays used in the Toolbar --&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;script src=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/container/container_core-min.js"&gt;http://yui.yahooapis.com/2.3.1/build/container/container_core-min.js&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;script src=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/menu/menu-min.js"&gt;http://yui.yahooapis.com/2.3.1/build/menu/menu-min.js&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;script src=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/button/button-beta-min.js"&gt;http://yui.yahooapis.com/2.3.1/build/button/button-beta-min.js&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;!-- Source file for Rich Text Editor--&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;script src=&amp;quot;&lt;a href="http://yui.yahooapis.com/2.3.1/build/editor/editor-beta-min.js"&gt;http://yui.yahooapis.com/2.3.1/build/editor/editor-beta-min.js&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;style&amp;gt; &lt;br&gt;&lt;br&gt;body { margin:0; padding:0; font-face: arial; font-size: 10pt;} &lt;br&gt;&lt;br&gt;.yui-editor-container {z-index: 999;} &lt;br&gt;&lt;br&gt;.editable { &lt;br&gt;&lt;br&gt;border: 5px solid black; &lt;br&gt;&lt;br&gt;argin-top: 100px; &lt;br&gt;&lt;br&gt; margin: .25em; &lt;br&gt;&lt;br&gt;float: left; &lt;br&gt;&lt;br&gt;width: 350px; &lt;br&gt;&lt;br&gt;height: 100px; &lt;br&gt;&lt;br&gt;overflow: auto; &lt;br&gt;&lt;br&gt;} &lt;br&gt;&lt;br&gt;.textbox { &lt;br&gt;&lt;br&gt;margin-left: 10px; &lt;br&gt;&lt;br&gt;width: 100px; &lt;br&gt;&lt;br&gt;height: 25px; &lt;br&gt;&lt;br&gt;} &lt;br&gt;&lt;br&gt; .label { &lt;br&gt;&lt;br&gt;margin-left: 10px; &lt;br&gt;&lt;br&gt;width: 50px; &lt;br&gt;&lt;br&gt;height: 25px; &lt;br&gt;&lt;br&gt;font-weight: bold; &lt;br&gt;&lt;br&gt;} &lt;br&gt;&lt;br&gt;&amp;lt;/style&amp;gt;&amp;lt;/head&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;body class=&amp;quot;yui-skin-sam&amp;quot;&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;First Name:&amp;lt;/span&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;firstName&amp;quot; id=&amp;quot;firstName&amp;quot; class=&amp;quot;textbox&amp;quot; /&amp;gt;&amp;lt;br /&amp;gt; &lt;br&gt; &lt;br&gt;&amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;Last Name:&amp;lt;/span&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;lastName&amp;quot; id=&amp;quot;lastName&amp;quot; class=&amp;quot;textbox&amp;quot; /&amp;gt;&amp;lt;br /&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;textarea name=&amp;quot;texteditor&amp;quot; id=&amp;quot;texteditor&amp;quot;&amp;gt; &lt;br&gt; &lt;br&gt;Test within TextArea. &lt;br&gt;&lt;br&gt;&amp;lt;/textarea&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;script&amp;gt; &lt;br&gt;&lt;br&gt;var toolbar = { &lt;br&gt;&lt;br&gt;height: &amp;#39;200px&amp;#39;, &lt;br&gt;&lt;br&gt;width: &amp;#39;420px&amp;#39;, &lt;br&gt;&lt;br&gt;toolbar: { &lt;br&gt;&lt;br&gt;titlebar: &amp;#39;TechRepublic.com Editor&amp;#39;, &lt;br&gt; &lt;br&gt;collapse: true, &lt;br&gt;&lt;br&gt;buttons: [ &lt;br&gt;&lt;br&gt;{ group: &amp;#39;textstyle&amp;#39;, label: &amp;#39;Font Style&amp;#39;, &lt;br&gt;&lt;br&gt;buttons: [ &lt;br&gt;&lt;br&gt;{ type: &amp;#39;push&amp;#39;, label: &amp;#39;Bold&amp;#39;, value: &amp;#39;bold&amp;#39; }, &lt;br&gt;&lt;br&gt;{ type: &amp;#39;push&amp;#39;, label: &amp;#39;Italic&amp;#39;, value: &amp;#39;italic&amp;#39; }, &lt;br&gt; &lt;br&gt;{ type: &amp;#39;push&amp;#39;, label: &amp;#39;Underline&amp;#39;, value: &amp;#39;underline&amp;#39; }, &lt;br&gt;&lt;br&gt;{ type: &amp;#39;separator&amp;#39; }, &lt;br&gt;&lt;br&gt;{ type: &amp;#39;select&amp;#39;, label: &amp;#39;Arial&amp;#39;, value: &amp;#39;fontname&amp;#39;, disabled: true, &lt;br&gt; &lt;br&gt;menu: [ &lt;br&gt;&lt;br&gt;{ text: &amp;#39;Arial&amp;#39;, checked: true }, &lt;br&gt;&lt;br&gt;{ text: &amp;#39;Arial Black&amp;#39; }, &lt;br&gt;&lt;br&gt;{ text: &amp;#39;Comic Sans MS&amp;#39; }, &lt;br&gt;&lt;br&gt;{ text: &amp;#39;Courier New&amp;#39; }, &lt;br&gt;&lt;br&gt;{ text: &amp;#39;Lucida Console&amp;#39; }, &lt;br&gt; &lt;br&gt;{ text: &amp;#39;Tahoma&amp;#39; }, &lt;br&gt;&lt;br&gt;{ text: &amp;#39;Times New Roman&amp;#39; }, &lt;br&gt;&lt;br&gt;{ text: &amp;#39;Trebuchet MS&amp;#39; }, &lt;br&gt;&lt;br&gt;{ text: &amp;#39;Verdana&amp;#39; } &lt;br&gt;&lt;br&gt;] }, &lt;br&gt;&lt;br&gt;{ type: &amp;#39;spin&amp;#39;, label: &amp;#39;13&amp;#39;, value: &amp;#39;fontsize&amp;#39;, range: [ 9, 75 ], disabled: true }, &lt;br&gt; &lt;br&gt;{ type: &amp;#39;separator&amp;#39; }, &lt;br&gt;&lt;br&gt;{ type: &amp;#39;color&amp;#39;, label: &amp;#39;Font Color&amp;#39;, value: &amp;#39;forecolor&amp;#39;, disabled: true }, &lt;br&gt;&lt;br&gt;{ type: &amp;#39;color&amp;#39;, label: &amp;#39;Background Color&amp;#39;, value: &amp;#39;backcolor&amp;#39;, disabled: true } &lt;br&gt; &lt;br&gt;] } ] } }; &lt;br&gt;&lt;br&gt;myEditor = new YAHOO.widget.Editor(&amp;#39;texteditor&amp;#39;, toolbar); &lt;br&gt;&lt;br&gt;myEditor.render(); &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: November 5th, 2007&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: Tony Patton &lt;/li&gt; &lt;/ul&gt;&lt;pre&gt;&lt;br&gt;&lt;br&gt;&amp;lt;/script&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/pre&gt; &lt;p&gt;It is worth noting that the text is formatted using standard HTML to format the text within the Rich Text Editor, so bold text uses the HTML strong element; the font element is used for font styling, and so forth.&lt;/p&gt; &lt;h2&gt;An improved interface&lt;/h2&gt; &lt;p&gt;I have been a big fan of the YUI Library since I first discovered it more than a year ago. It allows developers to build powerful Web interfaces using code that has been fully tested for proper functionality. The Rich Text Editor is just one example of the power controls available in the YUI Library.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-723782410513339169?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/723782410513339169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=723782410513339169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/723782410513339169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/723782410513339169'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/support-rich-text-with-yahoo-user.html' title='Support rich text with the Yahoo! User Interface Library'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-4111415164610156769</id><published>2008-12-23T12:41:00.001+05:00</published><updated>2008-12-23T12:41:09.522+05:00</updated><title type='text'>Moving to CSS-based layouts with the YUI Library</title><content type='html'>&lt;p&gt;While initiating a recent project to make substantial changes to an existing Web application, it was decided to dump the table-based layout used in its original design in favor of &lt;a target="_blank" href="http://downloads.techrepublic.com.com/download.aspx?docid=307308"&gt;CSS&lt;/a&gt;. We opted to use the &lt;a target="_blank" href="http://developer.yahoo.com/yui/index.html"&gt;Yahoo! User Interface (YUI) Library&lt;/a&gt; after evaluating different approaches. The YUI Library provides core CSS resources that have been developed by a professional team of developers and extensively tested by the Web community.&lt;/p&gt; &lt;p&gt;This tutorial walks you through the steps of how to move from a table-based design to a CSS-based layout with the help of the YUI Library.&lt;/p&gt; &lt;h2&gt;The layout&lt;/h2&gt; &lt;p&gt;It is worth considering the division of screen real estate in the application to understand how it is coded using both tables and CSS. The overall page is divided into two horizontal sections: a header and a body.&lt;/p&gt; &lt;p&gt;The header portion can be further divided into three horizontal strips. The first strip contains a strip of color at the top. The middle row contains text and a logo on a white background. The final row has its own background color along with a breadcrumb.&lt;/p&gt; &lt;p&gt;The body portion of the page is divided into two columns. The first column is a navigation area featuring a list of navigation links. The second column is divided into two rows with a small footer row at the bottom, and the rest is devoted to page content.&lt;/p&gt; &lt;p&gt;The site design does not change from the original product developed with Dreamweaver and HTML tables. The introduction of CSS will deliver cleaner code with a smaller footprint and simplified maintenance.&lt;/p&gt; &lt;h2&gt;Table-based layout&lt;/h2&gt; &lt;p&gt;The original design used six HTML tables to divide the page and deliver the solution. It used CSS to style text on the page, but CSS usage stopped at that point. The following listing includes the HTML source. Background colors are assigned to each table (via the &lt;em&gt;bgcolor&lt;/em&gt; attribute) to provide a visual cue of the layout.&lt;/p&gt; &lt;pre&gt;&amp;lt;html&amp;gt;&lt;br&gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Table-based page layout&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&amp;lt;table bgcolor=&amp;quot;yellow&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot;&amp;gt;&lt;br&gt; &amp;lt;tbody&amp;gt;&lt;br&gt;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;3&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/pre&gt; &lt;pre&gt;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;3&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;table bgcolor=&amp;quot;red&amp;quot; border=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;tr&amp;gt;&lt;br&gt;&amp;lt;td width=&amp;quot;85%&amp;quot; valign=&amp;quot;middle&amp;quot;&amp;gt;Header Text&amp;lt;/td&amp;gt;&lt;br&gt; &amp;lt;td width=&amp;quot;15%&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;logo.jpg&amp;quot; mce_src=&amp;quot;logo.jpg&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br&gt;&amp;lt;tr&amp;gt;&lt;br&gt;&amp;lt;td width=&amp;quot;16%&amp;quot; height=&amp;quot;20&amp;quot; nowrap&amp;gt;Breadcrumb&amp;lt;/td&amp;gt;&lt;br&gt; &amp;lt;td width=&amp;quot;40%&amp;quot; height=&amp;quot;20&amp;quot; align=&amp;quot;right&amp;quot; nowrap&amp;gt;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;lt;/tr&amp;gt;&lt;br&gt;&amp;lt;tr&amp;gt;&lt;br&gt;&amp;lt;td width=&amp;quot;10%&amp;quot; rowspan=&amp;quot;2&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;table bgcolor=&amp;quot;green&amp;quot; width=&amp;quot;101%&amp;quot; height=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot;&lt;br&gt; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;tr&amp;gt;&lt;br&gt;&amp;lt;td height=&amp;quot;167&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;table bgcolor=&amp;quot;light blue&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br&gt; &amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;3&amp;quot;&amp;gt;Menu&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br&gt;&amp;lt;tr&amp;gt;&lt;br&gt;&amp;lt;td width=&amp;quot;8&amp;quot;&amp;gt;&amp;nbsp;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;lt;td&amp;gt;Nav Link&amp;lt;/td&amp;gt;&lt;br&gt;&amp;lt;td width=&amp;quot;4&amp;quot;&amp;gt;&amp;nbsp;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&lt;br&gt; &amp;lt;td height=&amp;quot;100%&amp;quot; colspan=&amp;quot;2&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;table bgcolor=&amp;quot;brown&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br&gt; &amp;lt;tr&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;table bgcolor=&amp;quot;silver&amp;quot; width=&amp;quot;96%&amp;quot; height=&amp;quot;220&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&lt;br&gt;&amp;lt;td valign=top align=left width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br&gt; &amp;lt;p&amp;gt;Content goes here&amp;lt;/p&amp;gt;&lt;br&gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br&gt;&amp;lt;td height=&amp;quot;40&amp;quot; valign=&amp;quot;middle&amp;quot;&amp;gt;&lt;br&gt;Footer&lt;br&gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br&gt; &amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/pre&gt; &lt;p&gt;The table-based layout solution delivers the desired results, but it can be confusing to make layout changes. A quick perusal of the code demonstrates the confusing nature of using tables for layout.&lt;/p&gt; &lt;p&gt;It takes time to make layout changes and&amp;nbsp;to convert a table-based solution to a CSS alternative, so selling such a change to a client can be daunting. In our case, the client was technically savvy and easily convinced when we showed the simplified approach offered by CSS.&lt;/p&gt; &lt;h2&gt;YUI Grids CSS&lt;/h2&gt; &lt;p&gt;The use of the &lt;a target="_blank" href="http://developer.yahoo.com/yui/grids/"&gt;YUI Grids CSS&lt;/a&gt; feature of the YUI Library added another level of acceptance via a tested solution. YUI Grids CSS provides a CSS solution for delivering page layouts that divide the page into areas.&lt;/p&gt; &lt;p&gt;A great aspect of the YUI Grids CSS feature is its &lt;a target="_blank" href="http://developer.yahoo.com/yui/articles/gbs/index.html#history"&gt;A-level browser support&lt;/a&gt;, which provides the highest support level in terms of browsers. This means you don't have to worry about the quirks in different browsers when using CSS for layout.&lt;/p&gt; &lt;h2&gt;CSS layout&lt;/h2&gt; &lt;p&gt;YUI Grids CSS offers preset page widths and templates, along with the ability to nest and stack layouts to generate what you need. Yahoo boasts the capability to deliver more than 1,000 layout combinations with it. YUI Grids CSS is part of the &lt;a target="_blank" href="http://developer.yahoo.com/yui/download/"&gt;YUI Library download&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;We used the following features of the YUI Grids CSS feature:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;The 100% page width is employed via the doc3 id attribute assigned to the overall &amp;lt;DIV&amp;gt; container.&lt;/li&gt;&lt;li&gt;The entire page is divided into three rows using three &amp;lt;DIV&amp;gt; elements. The YUI Grids CSS standard id attributes for header (hd), body (bd), and footer (ft) are used.&lt;/li&gt;&lt;li&gt;The header has three rows using two &amp;lt;P&amp;gt; elements and a &amp;lt;DIV&amp;gt; element. The &amp;lt;DIV&amp;gt; includes another &amp;lt;DIV&amp;gt; that uses YUI Grids CSS features. This includes the 100% page width (doc3 attribute), as well as a preset template that has two columns with the narrower column on the left with a width of 180 pixels. The narrower column is assigned the class id of yui-b with the larger column assigned the yui-main attribute. The two columns are used to ensure the breadcrumb appears above the content area of the page.&lt;/li&gt;&lt;li&gt;The middle or body row of the whole page layout is divided into two columns with a left column width of 180 pixels. This is accomplished with a predefined template employed by assigning the yui-t2 class to the body's &amp;lt;DIV&amp;gt; container. The smaller left column is designated with the yui-b class assignment, and the main area is designated with the yui-main class assignment.&lt;/li&gt;&lt;li&gt;The footer row uses the same approach as the body with two columns — a left column of 180 pixels.&lt;/li&gt;&lt;li&gt;The smaller left column of the body row of the page contains a navigation menu. The menu is created with an HTML unordered list and styled via CSS.&lt;/li&gt;&lt;li&gt;The YUI Grids CSS is contained in one CSS file available in the YUI Library download. The file is called grids.css and has a small footprint of 4KB.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Here is the source of the reworked page:&lt;/p&gt; &lt;pre&gt;&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot; &amp;quot;&lt;a href="http://www.w3.org/TR/html4/strict.dtd"&gt;http://www.w3.org/TR/html4/strict.dtd&lt;/a&gt;&amp;quot;&amp;gt;&lt;/pre&gt; &lt;pre&gt;&amp;lt;html&amp;gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&amp;lt;title&amp;gt;Reworked with YUI Grids CSS&amp;lt;/title&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;grids.css&amp;quot; mce_href=&amp;quot;grids.css&amp;quot;&amp;gt;&lt;br&gt; &amp;lt;/head&amp;gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&amp;lt;div id=&amp;quot;doc3&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;div id=&amp;quot;hd&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;p class=&amp;quot;header1&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br&gt;&amp;lt;p class=&amp;quot;header3&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;span&amp;gt;Text&amp;lt;/span&amp;gt;&lt;br&gt; &amp;lt;span class=&amp;quot;logo&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br&gt;&amp;lt;/p&amp;gt;&lt;br&gt;&amp;lt;div&amp;gt;&lt;br&gt;&amp;lt;div id=&amp;quot;doc3&amp;quot; class=&amp;quot;yui-t2&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;div class=&amp;quot;yui-b&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;lt;div id=&amp;quot;yui-main&amp;quot;&amp;gt;&lt;br&gt; &amp;lt;div class=&amp;quot;yui-b&amp;quot;&amp;gt;Breadcrumb&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;div id=&amp;quot;bd&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;div id=&amp;quot;doc3&amp;quot; class=&amp;quot;yui-t2&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;div class=&amp;quot;yui-b&amp;quot;&amp;gt;&lt;br&gt; &amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;li class=&amp;quot;main&amp;quot;&amp;gt;Menu&amp;lt;/li&amp;gt;&lt;br&gt;&amp;lt;li class=&amp;quot;sub&amp;quot;&amp;gt;Nav Link&amp;lt;/li&amp;gt;&lt;br&gt;&amp;lt;/ul&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;lt;div id=&amp;quot;yui-main&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;div class=&amp;quot;yui-b&amp;quot;&amp;gt;&lt;br&gt; Content goes here&lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;div id=&amp;quot;ft&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;div id=&amp;quot;doc3&amp;quot; class=&amp;quot;yui-t2&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;div class=&amp;quot;yui-b&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br&gt; &amp;lt;div id=&amp;quot;yui-main&amp;quot;&amp;gt;&lt;br&gt;&amp;lt;div class=&amp;quot;yui-b&amp;quot;&amp;gt;&lt;/pre&gt; &lt;pre&gt;Footer&lt;br&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt; &lt;pre&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt; &lt;pre&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt; &lt;pre&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt; &lt;pre&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt; &lt;pre&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/pre&gt; &lt;p&gt;You may cringe at the sight of so many &amp;lt;DIV&amp;gt; elements, but this is much easier to follow compared to its table counterpart. Also, the CSS approach allows you to easily modify the layout by editing the CSS or changing what YUI Grids CSS features are used.&lt;/p&gt; &lt;p&gt;For example, we could easily modify the layout to use a layout with a left column of 160 pixels by changing the class assigned to the &amp;lt;DIV&amp;gt; elements from yui-t2 to yui-t1. In order to use this approach, you need to be familiar with using YUI Grids CSS.&lt;/p&gt; &lt;p&gt;There's a caveat to working with the free CSS elements of the YUI Library: It's tricky to alter the source CSS. The code contains many so-called hacks in order to work with all browsers that you may not be fully aware of all of them when you're editing the CSS. For me, I avoid working directly with the source and work within the confines of the YUI Library.&lt;/p&gt; &lt;h2&gt;Making the switch&lt;/h2&gt; &lt;p&gt;CSS has matured to the point where using it for layout is now acceptable. However, this approach does have pitfalls, which include browser quirks. For this reason, I find the freely available YUI Grids CSS portion of the YUI Library to be an excellent resource for building Web interfaces that use Web standards.&lt;/p&gt; &lt;p&gt;Are you embracing CSS for Web page layout? Do you use any aspect of the YUI Library in your applications? Share your experiences with the Web Developer community.&lt;/p&gt; &lt;h2&gt;Additional TechRepublic resources about the YUI Library&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a target="_blank" href="http://articles.techrepublic.com.com/5100-3513-6100361.html"&gt;Build powerful Web applications via the Yahoo! Developer Network&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://articles.techrepublic.com.com/5100-10878_11-6102360.html"&gt;Get reusable CSS at no cost from Yahoo!&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a target="_blank" href="http://blogs.techrepublic.com.com/programming-and-development/?p=541http://blogs.techrepublic.com.com/programming-and-development/?p=541"&gt;Support rich text with the Yahoo! User Interface Library&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;br&gt;&lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: March 17th, 2008&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: Tony Patton &lt;/li&gt;&lt;/ul&gt;&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-4111415164610156769?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/4111415164610156769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=4111415164610156769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/4111415164610156769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/4111415164610156769'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/moving-to-css-based-layouts-with-yui.html' title='Moving to CSS-based layouts with the YUI Library'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-5512415691489897697</id><published>2008-12-23T12:40:00.001+05:00</published><updated>2008-12-23T12:40:21.222+05:00</updated><title type='text'>Build directory structures using SQL Server 2005</title><content type='html'>&lt;p&gt;If you ever work with directory structures on the filing system, you know how challenging it can be to traverse through folders to find specific file(s). If you store this type of information structure in the database, you are even more aware of what it takes to retrieve the data. Writing queries to pull this information is sometimes difficult to achieve and inefficient. You can use the &lt;a target="_blank" href="http://blogs.techrepublic.com.com/datacenter/?p=275"&gt;recursion&lt;/a&gt; and &lt;a target="_blank" href="http://articles.techrepublic.com.com/5100-9592-6140404.html"&gt;XML features&lt;/a&gt; in SQL Server 2005 to build a file location on the fly.&lt;/p&gt;  &lt;h2&gt;Example&lt;/h2&gt; &lt;p&gt;This example searches for a document and builds the path to the document based upon a parent-folder to child-folder relationship in the database. One file will belong to one folder, which may be a child folder in a long lineage of parent folders. The ultimate goal is to provide a file to be searched for, and the process will build the location to the file.&lt;/p&gt; &lt;p&gt;I've seen file path locations stored several ways in the database, usually with the purpose of storing the location of a file to be pulled for a Web site. Most of the time, the full path to a file is stored in one database field, but I have also seen the location of a file "&lt;a target="_blank" href="http://articles.techrepublic.com.com/5100-9592_11-6135910.html"&gt;normalized&lt;/a&gt;" so that the past must be built when needed. My goal for this article is to solve the issue of building the path from the hierarchical structure.&lt;/p&gt; &lt;p&gt;The script below creates a Documents table and a Folders table. The Documents table stores the filenames and the folder that the document resides in. The Folders table stores the directory structure of one or more local or network drives. Most of the work in this example will involve traversing through this folder structure to build the path to the file.&lt;/p&gt; &lt;pre&gt;IF OBJECT_ID(&amp;#39;Documents&amp;#39;,&amp;#39;U&amp;#39;) IS NOT NULL&lt;br&gt; DROP TABLE Documents     &lt;br&gt;&lt;br&gt; IF OBJECT_ID(&amp;#39;Folders&amp;#39;,&amp;#39;U&amp;#39;) IS NOT NULL&lt;br&gt; DROP TABLE Folders     &lt;br&gt;&lt;br&gt; IF OBJECT_ID(&amp;#39;udf_BuildDocumentPath&amp;#39;,&amp;#39;FN&amp;#39;) IS NOT NULL&lt;br&gt;  DROP FUNCTION udf_BuildDocumentPath     &lt;br&gt;&lt;br&gt; CREATE TABLE Documents&lt;br&gt; (&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DocumentID SMALLINT,&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FolderID SMALLINT,&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DocumentName VARCHAR(255)&lt;br&gt; )     &lt;br&gt;&lt;br&gt; CREATE TABLE Folders&lt;br&gt;  (&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FolderID SMALLINT,&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ParentFolderID SMALLINT,&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FolderName VARCHAR(255)&lt;br&gt; )&lt;/pre&gt; &lt;p&gt;The code below adds data to our newly created tables. I am adding data for three documents, all of which are located in the same folder.&lt;/p&gt; &lt;pre&gt;INSERT INTO Documents(DocumentID, FolderID, DocumentName)&lt;br&gt; VALUES(1,5,&amp;#39;SalesForecast2008.xls&amp;#39;)&lt;br&gt; INSERT INTO Documents(DocumentID, FolderID, DocumentName)&lt;br&gt; VALUES(2,5,&amp;#39;SalesProjection.doc&amp;#39;)&lt;br&gt;  INSERT INTO Documents(DocumentID, FolderID, DocumentName)&lt;br&gt; VALUES(3,5,&amp;#39;SalesForecastPresentation.ppt&amp;#39;)     &lt;br&gt;&lt;br&gt; INSERT INTO Folders(FolderID, ParentFolderID, FolderName)&lt;br&gt; VALUES(1,null, &amp;#39;D:&amp;#39;)&lt;br&gt;  INSERT INTO Folders(FolderID, ParentFolderID, FolderName)&lt;br&gt; VALUES(2,1, &amp;#39;Sales&amp;#39;)&lt;br&gt; INSERT INTO Folders(FolderID, ParentFolderID, FolderName)&lt;br&gt; VALUES(3,2, &amp;#39;Forecasts&amp;#39;)&lt;br&gt; INSERT INTO Folders(FolderID, ParentFolderID, FolderName)&lt;br&gt;  VALUES(4,3, &amp;#39;Data&amp;#39;)&lt;br&gt; INSERT INTO Folders(FolderID, ParentFolderID, FolderName)&lt;br&gt; VALUES(5,4, &amp;#39;2008&amp;#39;)&lt;br&gt; GO&lt;/pre&gt; &lt;p&gt;The script below creates the function that will build the full path to the file based upon the DocumentID in the Documents table. This function uses a recursive common table expression (CTE) to traverse through the directory structure, linking the child folder ID to the parent folder ID in the table. Once the set of records are found that comprise the full path to the document, the FOR XML PATH('') construct is used to "pivot" these values from values in different rows to values concatenated in the same row. From there, it is just a matter of returning the build path to the caller.&lt;/p&gt; &lt;p&gt;FOR XML Path() is one of my favorite features in SQL Server 2005 because it makes it so easy to take a list of column values from different rows and concatenate them together so that they are on the same row. It is an ideal tool for &lt;a target="_blank" href="http://blogs.techrepublic.com.com/datacenter/?p=306"&gt;dynamically building SQL statements&lt;/a&gt; that require list of different values for use in an IN() statement.&lt;/p&gt;  &lt;pre&gt;CREATE FUNCTION udf_BuildDocumentPath&lt;br&gt; (&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @DocumentID SMALLINT&lt;br&gt; )&lt;br&gt; RETURNS VARCHAR(400)&lt;br&gt; AS&lt;br&gt; BEGIN&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE @ReturnPath VARCHAR(400)     &lt;br&gt;&lt;br&gt; ;WITH DirectoryPathCTE(DocumentID, FolderID, ParentFolderID, DocumentName, FolderName, LevelNumber)&lt;br&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AS&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&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; DocumentID, f.FolderID, ParentFolderID, DocumentName, f.FolderName, 0&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&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; Documents d&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; INNER JOIN folders f on d.FolderID = f.FolderID&lt;br&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&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; DocumentID = @DocumentID&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNION ALL&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&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; DocumentID, f.FolderID, f.ParentFolderID, DocumentName, f.FolderName, p.LevelNumber + 1&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&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; Folders f&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; INNER JOIN DirectoryPathCTE p on p.ParentFolderID = f.FolderID&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @ReturnPath =&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&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; SELECT&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;nbsp;&amp;nbsp; FolderName + &amp;#39;&amp;#39; + CASE WHEN LevelNumber = 0 THEN DocumentName ELSE &amp;#39;&amp;#39; END&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; FROM&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DirectoryPathCTE p&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; ORDER BY LevelNumber DESC&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; FOR XML PATH(&amp;#39;&amp;#39;)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; )      &lt;br&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN(@ReturnPath)     &lt;br&gt;&lt;br&gt;  END&lt;br&gt; GO&lt;/pre&gt; &lt;p&gt;Now that my function is built, I can call it for every document I have in my Documents table, and the path to the file will be built based upon the DocumentID in the Documents table.&lt;/p&gt; &lt;pre&gt;SELECT dbo.udf_BuildDocumentPath(d.DocumentID)&lt;br&gt; FROM Documents d&lt;/pre&gt; &lt;h2&gt;Conclusion&lt;/h2&gt; &lt;p&gt;Even if you never need to implement the example in this article, I hope you'll take away some ideas from the recursion and the FOR XML PATH clause to solve some tricky problems you may encounter in the future.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: March 17th, 2008&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: Tim Chapman &lt;/li&gt;&lt;/ul&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-5512415691489897697?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/5512415691489897697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=5512415691489897697' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5512415691489897697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5512415691489897697'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/build-directory-structures-using-sql.html' title='Build directory structures using SQL Server 2005'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-5591984593217008306</id><published>2008-12-23T12:37:00.001+05:00</published><updated>2008-12-23T12:37:58.910+05:00</updated><title type='text'>Adapt to your audience with CSS media types</title><content type='html'>&lt;p&gt;In addition to worrying about browsers, Web standards, and more, you also have to consider the multitude of devices or media that may be used to view a site. The CSS media type provides the functionality to build Web applications whose presentation may vary with its target media. Here's an examination of this CSS feature, along with examples.&lt;/p&gt; &lt;h2&gt;The media&lt;/h2&gt; &lt;p&gt;A CSS media type names a set of CSS properties. A user agent that claims to support a media type by name must implement all of the properties that apply to that media type. Style sheets allow you to specify how a document is presented with different media. For example, viewing a page on the screen should be presented differently than when it is printed or spoken via a speech synthesizer for the visually impaired.&lt;/p&gt; &lt;p&gt;Here's a list of the media types that are currently supported:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;strong&gt;all:&lt;/strong&gt; Applies to all media types.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;aural:&lt;/strong&gt; Used for speech and sound synthesizers.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;braille:&lt;/strong&gt; Provides support for braille tactile feedback devices.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;embossed:&lt;/strong&gt; Used for paged braille printers.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;handheld:&lt;/strong&gt; Used to target small or handheld devices with limited screen space.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;print:&lt;/strong&gt; Applies to printers, so users can easily print a page's content.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;projection:&lt;/strong&gt; Used for projected presentations like slides.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;screen:&lt;/strong&gt; The most common delivery mechanism for Web content: the computer screen.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;tty:&lt;/strong&gt; Used for media using a fixed-pitch character grid, like teletypes and terminals.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;tv:&lt;/strong&gt; This applies to television-like devices such as &lt;a target="_blank" href="http://www.webtv.com/pc/"&gt;MSN TV&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;With these media types in mind, you can develop separate style sheets to use for the different media that may be used by users who visit your site.&lt;/p&gt; &lt;h2&gt;Media-specific CSS&lt;/h2&gt; &lt;p&gt;You may specify different media types a variety of ways. First, you may use @import at-rules that specify the media type for an external style sheet that is imported, as the following line accomplishes with importing a special style sheet for tv-based devices.&lt;/p&gt; &lt;pre&gt;@import url(&amp;quot;webtv.css&amp;quot;) tv;&lt;/pre&gt; &lt;p&gt;You may use the @media rule to provide presentation rules for handling certain media types within a Web page. The following lines show how this could be used to use a white background for tv-like devices:&lt;/p&gt; &lt;pre&gt;@media tv {&lt;br&gt;background: #fff;&lt;br&gt;}&lt;/pre&gt; &lt;p&gt;The Link HTML element allows you to link to external style sheets and use the media attribute to specify the target media type for the link. The following snippet shows how it may be used:&lt;/p&gt; &lt;pre&gt;&amp;lt;LINK rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;tv&amp;quot; href=&amp;quot;tv.css&amp;quot; mce_href=&amp;quot;tv.css&amp;quot;&amp;gt;&lt;/pre&gt; &lt;p&gt;A caveat of each approach is that you may specify more than one media type for a rule by separating the individual media types with commas. For example, the previous HTML snippet can be rewritten to target tv-like media as well as projection media with the following line.&lt;/p&gt; &lt;pre&gt;&amp;lt;LINK rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;tv, projection&amp;quot;&lt;br&gt;href=&amp;quot;tv.css&amp;quot; mce_href=&amp;quot;tv.css&amp;quot;&amp;gt;&lt;/pre&gt; &lt;h2&gt;In action&lt;/h2&gt; &lt;p&gt;Different media types are supported so you can format content differently for the various device or media types available. A good example is printing where items like menus and sidebars are omitted (most often using display: none) in the printed output. (Check out Shawn Morton's article about &lt;a target="_blank" href="http://articles.techrepublic.com.com/5100-6329_11-5035184.html"&gt;building printer-friendly pages&lt;/a&gt;.)&lt;/p&gt; &lt;p&gt;The following CSS is included as a brief example of formatting content for different media types. The background is blue for regular screens and white for printed or handheld output. Also, the font size is set to easier to read 12 point for printed output and smaller for handhelds. The font family is set to apply to all media types.&lt;/p&gt; &lt;pre&gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br&gt;@nedia all {&lt;br&gt;font-family: sans-serif;&lt;br&gt;}&lt;br&gt;@media handheld {&lt;br&gt;body {&lt;br&gt;border: none;&lt;br&gt;padding-bottom: 5px;&lt;br&gt;font-size: 8pt;&lt;br&gt;background: white;&lt;br&gt;}&lt;br&gt;h1, h2 {&lt;br&gt; font-size: 10pt;;&lt;br&gt;} }&lt;br&gt;@media screen {&lt;br&gt;body {&lt;br&gt;background: blue;&lt;br&gt;font-size: 10pt;&lt;br&gt;} }&lt;br&gt;@media print {&lt;br&gt;body {&lt;br&gt;width: auto;&lt;br&gt;margin: 0 5%;&lt;br&gt;padding: 0;&lt;br&gt;font-size: 12pt;&lt;br&gt;} }&lt;br&gt;&amp;lt;/style&amp;gt;&lt;/pre&gt;  &lt;p&gt;The size of the style sheet for each media type will be much larger than this simple example in real-world applications, so placing each media type's code in separate files and using the Link element will save bandwidth with less code to download. A key issue with any Web standard is its support within the community.&lt;/p&gt; &lt;h2&gt;Support&lt;/h2&gt; &lt;p&gt;CSS media types are a part of the &lt;a target="_blank" href="http://www.w3.org/TR/REC-CSS2/"&gt;CSS2&lt;/a&gt; standard, but browser adoption and compliance has been very slow. The media type values of all, screen, and print are well supported, but the remaining types have only received limited support within the browser market. You should test vigorously to ensure the results match expectations with target platforms.&lt;/p&gt; &lt;p&gt;At this time, the handheld media type is supported by some devices and software, so you should test with target devices to measure support. The Opera browser supports the projection media type, but support outside of Opera is limited. Support for the other media types like braille, tv, tty, embossed, and aural is almost non-existent. The &lt;a target="_blank" href="http://www.cs.cornell.edu/Info/People/raman/emacspeak/emacspeak.html"&gt;Emacspeak&lt;/a&gt; browser utilizes the aural media type.&lt;/p&gt;  &lt;h2&gt;Know your audience&lt;/h2&gt; &lt;p&gt;The CSS2 specification includes the media type feature, which allows developers to tailor content for certain media types via style sheets. The feature has been adopted in a piecemeal fashion by the Web community as the print and screen types are fully supported, while support for others is inconsistent and sometimes non-existent. Meanwhile, the &lt;a target="_blank" href="http://www.w3.org/TR/css3-roadmap/"&gt;CSS3&lt;/a&gt; standard moves forward with the goal of &lt;a target="_blank" href="http://www.w3.org/TR/css3-mediaqueries/"&gt;enhancing the media type feature&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Have you included media type support in your Web applications? Share your thoughts and experiences with CSS and media types with the Web developer community by posting to the discussion.&lt;/p&gt; &lt;h2&gt;Additional CSS resources from TechRepublic&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a target="_blank" href="http://blogs.techrepublic.com.com/programming-and-development/?p=401"&gt;CSS 101: Styling the cursor&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://blogs.techrepublic.com.com/programming-and-development/?p=419"&gt;Control element placement with CSS stacking&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a target="_blank" href="http://blogs.techrepublic.com.com/howdoi/?p=151"&gt;How do I… Control the format of HTML lists with CSS?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://downloads.techrepublic.com.com/download.aspx?docid=307308"&gt;Download: CSS Reference Table&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;br&gt;&lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: April 4th, 2008&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: Tony Patton &lt;/li&gt;&lt;/ul&gt;&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-5591984593217008306?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/5591984593217008306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=5591984593217008306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5591984593217008306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5591984593217008306'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/adapt-to-your-audience-with-css-media.html' title='Adapt to your audience with CSS media types'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-3192526480198568010</id><published>2008-12-23T12:36:00.001+05:00</published><updated>2008-12-23T12:36:52.313+05:00</updated><title type='text'>How do I… Create a scrolling content box in CSS?</title><content type='html'>In my last &lt;a href="http://blogs.techrepublic.com.com/programming-and-development/?p=633" target="_blank"&gt;TechRepublic Programming and Development blog&lt;/a&gt; entry, I showed you how to use Flash to create an animation that mimicked the behavior of the retired (and sometimes reviled) &amp;lt;marquee&amp;gt; tag. I had mentioned that it was possible to use &lt;a href="http://search.techrepublic.com.com/index.php?t=1&amp;amp;s=0&amp;amp;o=0&amp;amp;q=css" target="_blank"&gt;CSS&lt;/a&gt; to duplicate the &amp;lt;marquee&amp;gt; tag as well, but only if it were coupled with a few lines of knotty JavaScript. &lt;p&gt;However, there is an alternative CSS markup that will let you confine large blocks of content to a set width and height and let you scroll through them using a scrollbar control. This gives the effect of viewing content in a frame (remember those?), but the scrolling box stays put on one page and you can place it anywhere in your layout that you wish. This gives both you and your clients much more control over how you view your Web pages. All of my clients like this layout solution, and I bet yours will as well.&lt;/p&gt; &lt;p&gt;&lt;em&gt;This blog post is also available in PDF format as a &lt;a href="http://downloads.techrepublic.com.com/abstract.aspx?docid=351960" target="_blank"&gt;TechRepublic download&lt;/a&gt;, which includes a sample Web page and the example code.&lt;/em&gt;&lt;/p&gt;  &lt;h2&gt;Start&lt;/h2&gt; &lt;p&gt;Open your preferred HTML editor and create a new page. Enter the code in &lt;strong&gt;Listing A&lt;/strong&gt; to get started.&lt;/p&gt; &lt;h3&gt;Listing A&lt;/h3&gt; &lt;pre&gt;&amp;lt;html&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;title&amp;gt;Scrolling Content Box&amp;lt;/title&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt; &lt;p&gt;Let's go ahead and place some formatted text in the Body of the HTML document, so we can see the effects of our CSS code as we build it (&lt;strong&gt;Listing B&lt;/strong&gt;). Place a significant amount of text into the page. This will give us plenty of text to scroll through when the page is complete.&lt;/p&gt; &lt;h3&gt;Listing B&lt;/h3&gt; &lt;pre&gt;&amp;lt;html&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;title&amp;gt; Scrolling Content Box &amp;lt;/title&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;quot;It had a perfectly round door like a porthole, painted green, with a shiny yellow brass knob in the exact middle. The door opened on to a tube-shaped hall like a tunnel: a very comfortable tunnel without smoke, with paneled walls and floors tiled and carpeted, provided with polished chairs, and lots and lots of pegs for hats and coats--the hobbit was fond of visitors. The tunnel wound on and on, going fairly but not quite straight into the side of the hill--The Hill, as all the people for many miles round called it--and many little round doors opened out of it, first on one side and then on another. No going upstairs for the hobbit: bedrooms, bathrooms, cellars, pantries (lots of these), wardrobes (he had whole rooms devoted to clothes), kitchens, dining-rooms, all were on the same floor, and indeed on the same passage. The best rooms were all on the lefthand side (going in), for these were the only ones to have windows, deep-set round windows looking over his garden and meadows beyond, sloping down to the river.&amp;quot;&lt;br&gt; &lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt; &lt;p&gt;Our text is in place, but let's go ahead and assign the CSS class to it. Even though the CSS markup has not been coded yet, by assigning the style to the text, you can preview the HTML you are writing at any time to see how the styling is built step by step.&lt;/p&gt; &lt;p&gt;We'll name our style class "scrollBox" in a couple of steps, so assign a &amp;lt;div&amp;gt; tag with that attribute as shown in &lt;strong&gt;Listing C&lt;/strong&gt;.&lt;/p&gt; &lt;h3&gt;Listing C&lt;/h3&gt; &lt;pre&gt;&amp;lt;html&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;title&amp;gt; Scrolling Content Box &amp;lt;/title&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;div class=&amp;quot;scrollBox&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;quot;It had a perfectly round door like a porthole, painted green, with a shiny yellow brass knob in the exact middle. The door opened on to a tube-shaped hall like a tunnel: a very comfortable tunnel without smoke, with paneled walls and floors tiled and carpeted, provided with polished chairs, and lots and lots of pegs for hats and coats--the hobbit was fond of visitors. The tunnel wound on and on, going fairly but not quite straight into the side of the hill--The Hill, as all the people for many miles round called it--and many little round doors opened out of it, first on one side and then on another. No going upstairs for the hobbit: bedrooms, bathrooms, cellars, pantries (lots of these), wardrobes (he had whole rooms devoted to clothes), kitchens, dining-rooms, all were on the same floor, and indeed on the same passage. The best rooms were all on the lefthand side (going in), for these were the only ones to have windows, deep-set round windows looking over his garden and meadows beyond, sloping down to the river.&amp;quot;&lt;br&gt; &lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt; &lt;p&gt;Now that our content is in place, it's time to create your CSS code in the head of the document Declare the style and place it immediately after the closing &amp;lt;/TITLE&amp;gt; tag. (&lt;strong&gt;Listing D&lt;/strong&gt;)&lt;/p&gt; &lt;h3&gt;Listing D&lt;/h3&gt; &lt;pre&gt;&amp;lt;html&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;title&amp;gt; Scrolling Content Box &amp;lt;/title&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;!--&lt;br&gt;&lt;br&gt;--&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/style&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&lt;br&gt; &amp;lt;body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;div class=&amp;quot;scrollBox&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;quot;It had a perfectly round door like a porthole, painted green, with a shiny yellow brass knob in the exact middle. The door opened on to a tube-shaped hall like a tunnel: a very comfortable tunnel without smoke, with paneled walls and floors tiled and carpeted, provided with polished chairs, and lots and lots of pegs for hats and coats--the hobbit was fond of visitors. The tunnel wound on and on, going fairly but not quite straight into the side of the hill--The Hill, as all the people for many miles round called it--and many little round doors opened out of it, first on one side and then on another. No going upstairs for the hobbit: bedrooms, bathrooms, cellars, pantries (lots of these), wardrobes (he had whole rooms devoted to clothes), kitchens, dining-rooms, all were on the same floor, and indeed on the same passage. The best rooms were all on the lefthand side (going in), for these were the only ones to have windows, deep-set round windows looking over his garden and meadows beyond, sloping down to the river.&amp;quot;&lt;br&gt; &lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt; &lt;p&gt;The next step is to declare a class name for the scrolling box style. Let's keep things simple and name it "scrollBox" by typing in the new code in &lt;strong&gt;Listing E&lt;/strong&gt;.&lt;/p&gt; &lt;h3&gt;Listing E&lt;/h3&gt; &lt;pre&gt;&amp;lt;html&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;title&amp;gt; Scrolling Content Box &amp;lt;/title&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;!-&lt;br&gt;&lt;br&gt;.scrollBox {&lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;--&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/style&amp;gt;&lt;br&gt; &lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;div class=&amp;quot;scrollBox&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;quot;It had a perfectly round door like a porthole, painted green, with a shiny yellow brass knob in the exact middle. The door opened on to a tube-shaped hall like a tunnel: a very comfortable tunnel without smoke, with paneled walls and floors tiled and carpeted, provided with polished chairs, and lots and lots of pegs for hats and coats--the hobbit was fond of visitors. The tunnel wound on and on, going fairly but not quite straight into the side of the hill--The Hill, as all the people for many miles round called it--and many little round doors opened out of it, first on one side and then on another. No going upstairs for the hobbit: bedrooms, bathrooms, cellars, pantries (lots of these), wardrobes (he had whole rooms devoted to clothes), kitchens, dining-rooms, all were on the same floor, and indeed on the same passage. The best rooms were all on the lefthand side (going in), for these were the only ones to have windows, deep-set round windows looking over his garden and meadows beyond, sloping down to the river.&amp;quot;&lt;br&gt; &lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt; &lt;p&gt;Now we have to assign some attributes to the scrollBox class. Let's start by defining how the text itself should look. Helvetica is back in style, and 10 pixels high with a line height of 12 pixels should look fine.&lt;/p&gt; &lt;h3&gt;Listing F&lt;/h3&gt; &lt;pre&gt;&amp;lt;html&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;title&amp;gt; Scrolling Content Box &amp;lt;/title&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;!-&lt;br&gt;&lt;br&gt;.scrollBox {&lt;br&gt;&lt;br&gt;font-family: Helvetica, sans-serif;&lt;br&gt; &lt;br&gt;      font-size: 10px;&lt;br&gt;&lt;br&gt;      line-height: 12px;&lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;--&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/style&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;div class=&amp;quot;scrollBox&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;quot;It had a perfectly round door like a porthole, painted green, with a shiny yellow brass knob in the exact middle. The door opened on to a tube-shaped hall like a tunnel: a very comfortable tunnel without smoke, with paneled walls and floors tiled and carpeted, provided with polished chairs, and lots and lots of pegs for hats and coats--the hobbit was fond of visitors. The tunnel wound on and on, going fairly but not quite straight into the side of the hill--The Hill, as all the people for many miles round called it--and many little round doors opened out of it, first on one side and then on another. No going upstairs for the hobbit: bedrooms, bathrooms, cellars, pantries (lots of these), wardrobes (he had whole rooms devoted to clothes), kitchens, dining-rooms, all were on the same floor, and indeed on the same passage. The best rooms were all on the lefthand side (going in), for these were the only ones to have windows, deep-set round windows looking over his garden and meadows beyond, sloping down to the river.&amp;quot;&lt;br&gt; &lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt; &lt;p&gt;The font is typeset to satisfaction. The next step is to determine how wide and tall the containing box will be. Type in the code in &lt;strong&gt;Listing G&lt;/strong&gt; to give the box a width of 200 pixels and a height of 150 pixels.&lt;/p&gt; &lt;h3&gt;Listing G&lt;/h3&gt; &lt;pre&gt;&amp;lt;html&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;title&amp;gt; Scrolling Content Box &amp;lt;/title&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;!-&lt;br&gt;&lt;br&gt;.scrollBox {&lt;br&gt;&lt;br&gt;font-family: Helvetica, sans-serif;&lt;br&gt; &lt;br&gt;      font-size: 10px;&lt;br&gt;&lt;br&gt;      line-height: 12px;&lt;br&gt;&lt;br&gt;height: 150px;&lt;br&gt;&lt;br&gt;      width: 200px;&lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;--&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/style&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;div class=&amp;quot;scrollBox&amp;quot;&amp;gt;&lt;br&gt; &lt;br&gt;&amp;quot;It had a perfectly round door like a porthole, painted green, with a shiny yellow brass knob in the exact middle. The door opened on to a tube-shaped hall like a tunnel: a very comfortable tunnel without smoke, with paneled walls and floors tiled and carpeted, provided with polished chairs, and lots and lots of pegs for hats and coats--the hobbit was fond of visitors. The tunnel wound on and on, going fairly but not quite straight into the side of the hill--The Hill, as all the people for many miles round called it--and many little round doors opened out of it, first on one side and then on another. No going upstairs for the hobbit: bedrooms, bathrooms, cellars, pantries (lots of these), wardrobes (he had whole rooms devoted to clothes), kitchens, dining-rooms, all were on the same floor, and indeed on the same passage. The best rooms were all on the lefthand side (going in), for these were the only ones to have windows, deep-set round windows looking over his garden and meadows beyond, sloping down to the river.&amp;quot;&lt;br&gt; &lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt; &lt;p&gt;If we were to just leave the styling alone here, the type would butt up against the scrollbar when it is viewed in the Web browser. Enter the additional code in &lt;strong&gt;Listing H&lt;/strong&gt; to give the type some padding along all edges of the containing box.&lt;/p&gt; &lt;h3&gt;Listing H&lt;/h3&gt; &lt;pre&gt;&amp;lt;html&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;title&amp;gt; Scrolling Content Box &amp;lt;/title&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;!-&lt;br&gt;&lt;br&gt;.scrollBox {&lt;br&gt;&lt;br&gt;font-family: Helvetica, sans-serif;&lt;br&gt; &lt;br&gt;      font-size: 10px;&lt;br&gt;&lt;br&gt;      line-height: 12px;&lt;br&gt;&lt;br&gt;height: 150px;&lt;br&gt;&lt;br&gt;      width: 200px;&lt;br&gt;&lt;br&gt;padding: 5px;&lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;--&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/style&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&lt;br&gt; &amp;lt;div class=&amp;quot;scrollBox&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;quot;It had a perfectly round door like a porthole, painted green, with a shiny yellow brass knob in the exact middle. The door opened on to a tube-shaped hall like a tunnel: a very comfortable tunnel without smoke, with paneled walls and floors tiled and carpeted, provided with polished chairs, and lots and lots of pegs for hats and coats--the hobbit was fond of visitors. The tunnel wound on and on, going fairly but not quite straight into the side of the hill--The Hill, as all the people for many miles round called it--and many little round doors opened out of it, first on one side and then on another. No going upstairs for the hobbit: bedrooms, bathrooms, cellars, pantries (lots of these), wardrobes (he had whole rooms devoted to clothes), kitchens, dining-rooms, all were on the same floor, and indeed on the same passage. The best rooms were all on the lefthand side (going in), for these were the only ones to have windows, deep-set round windows looking over his garden and meadows beyond, sloping down to the river.&amp;quot;&lt;br&gt; &lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt; &lt;p&gt;One last bit of graphic design before we move on to the scroll functionality. Give the box a light blue background using the additional markup shown in &lt;strong&gt;Listing I&lt;/strong&gt;.&lt;/p&gt; &lt;h3&gt;Listing I&lt;/h3&gt; &lt;pre&gt;&amp;lt;html&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;title&amp;gt; Scrolling Content Box &amp;lt;/title&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;!-&lt;br&gt;&lt;br&gt;.scrollBox {&lt;br&gt;&lt;br&gt;font-family: Helvetica, sans-serif;&lt;br&gt; &lt;br&gt;      font-size: 10px;&lt;br&gt;&lt;br&gt;      line-height: 12px;&lt;br&gt;&lt;br&gt;height: 150px;&lt;br&gt;&lt;br&gt;      width: 200px;&lt;br&gt;&lt;br&gt;padding: 5px;&lt;br&gt;&lt;br&gt;background-color: #CCCCFF;&lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;--&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/style&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt; &lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;div class=&amp;quot;scrollBox&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;quot;It had a perfectly round door like a porthole, painted green, with a shiny yellow brass knob in the exact middle. The door opened on to a tube-shaped hall like a tunnel: a very comfortable tunnel without smoke, with paneled walls and floors tiled and carpeted, provided with polished chairs, and lots and lots of pegs for hats and coats--the hobbit was fond of visitors. The tunnel wound on and on, going fairly but not quite straight into the side of the hill--The Hill, as all the people for many miles round called it--and many little round doors opened out of it, first on one side and then on another. No going upstairs for the hobbit: bedrooms, bathrooms, cellars, pantries (lots of these), wardrobes (he had whole rooms devoted to clothes), kitchens, dining-rooms, all were on the same floor, and indeed on the same passage. The best rooms were all on the lefthand side (going in), for these were the only ones to have windows, deep-set round windows looking over his garden and meadows beyond, sloping down to the river.&amp;quot;&lt;br&gt; &lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt; &lt;p&gt;Now, if you previewed your code thus far in a Web browser, you would see that the enormous block of text would be in a blue box, but it would be cut off after several lines. This is due to the height attribute. Therefore, we need a line of markup (shown in &lt;strong&gt;Listing J&lt;/strong&gt;) that tells the browser to allow us to see the text beyond that height limit. This is done with the overflow rule and we'll set its attribute to auto, which will tell the browser to show the scrollbar controls as needed.&lt;/p&gt; &lt;h3&gt;Listing J&lt;/h3&gt; &lt;pre&gt;&amp;lt;html&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;title&amp;gt; Scrolling Content Box &amp;lt;/title&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;!-&lt;br&gt;&lt;br&gt;.scrollBox {&lt;br&gt;&lt;br&gt;font-family: Helvetica, sans-serif;&lt;br&gt; &lt;br&gt;      font-size: 10px;&lt;br&gt;&lt;br&gt;      line-height: 12px;&lt;br&gt;&lt;br&gt;height: 150px;&lt;br&gt;&lt;br&gt;      width: 200px;&lt;br&gt;&lt;br&gt;padding: 5px;&lt;br&gt;&lt;br&gt;background-color: #CCCCFF;&lt;br&gt;&lt;br&gt;overflow: auto;&lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;--&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/style&amp;gt;&lt;br&gt; &lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;div class=&amp;quot;scrollBox&amp;quot;&amp;gt;&lt;br&gt;&lt;br&gt;&amp;quot;It had a perfectly round door like a porthole, painted green, with a shiny yellow brass knob in the exact middle. The door opened on to a tube-shaped hall like a tunnel: a very comfortable tunnel without smoke, with paneled walls and floors tiled and carpeted, provided with polished chairs, and lots and lots of pegs for hats and coats--the hobbit was fond of visitors. The tunnel wound on and on, going fairly but not quite straight into the side of the hill--The Hill, as all the people for many miles round called it--and many little round doors opened out of it, first on one side and then on another. No going upstairs for the hobbit: bedrooms, bathrooms, cellars, pantries (lots of these), wardrobes (he had whole rooms devoted to clothes), kitchens, dining-rooms, all were on the same floor, and indeed on the same passage. The best rooms were all on the lefthand side (going in), for these were the only ones to have windows, deep-set round windows looking over his garden and meadows beyond, sloping down to the river.&amp;quot;&lt;br&gt; &lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: April 10th, 2008&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: John Lee &lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;&lt;br&gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt; &lt;p&gt;Preview the page in several browsers across operating systems to see how they display the design markup and scrollbar controls.&lt;/p&gt; &lt;p&gt;Since &lt;em&gt;scrollBox&lt;/em&gt; is a CSS class, it can be styled even further and it can be applied to any HTML element, not just blocks of text. Try applying it to &amp;lt;img&amp;gt; tags, for example, to create scroll box containers for high-resolution images.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-3192526480198568010?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/3192526480198568010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=3192526480198568010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/3192526480198568010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/3192526480198568010'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/how-do-i-create-scrolling-content-box.html' title='How do I… Create a scrolling content box in CSS?'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-3067709797421301152</id><published>2008-12-23T12:35:00.001+05:00</published><updated>2008-12-23T12:35:32.570+05:00</updated><title type='text'>Create custom Visual Studio 2005 code snippets</title><content type='html'>&lt;p&gt;&lt;a target="_blank" href="http://blogs.techrepublic.com.com/programming-and-development/?p=655"&gt;Visual Studio 2005's built-in code snippets&lt;/a&gt; are great, but you can extend the concept by creating custom code snippets to easily reuse common code blocks in your application. This tutorial walks you through the process of creating custom code snippets.&lt;/p&gt; &lt;h2&gt;Creating the file&lt;/h2&gt; &lt;p&gt;Code snippets are defined in XML files with the .snippet file extension. Microsoft created the &lt;a target="_blank" href="http://msdn2.microsoft.com/en-us/library/ms171418.aspx"&gt;Code Snippet XML Schema&lt;/a&gt;, which defines the structure of a snippet XML file and specifies the elements (and their attributes) that you may use in a code snippet file.&lt;/p&gt; &lt;p&gt;Since code snippets are defined as XML, you can use your favorite XML or text editor to create and maintain them. Visual Studio 2005 supports XML editing, so it may be used to remain in a common environment.&lt;/p&gt; &lt;h2&gt;Code snippet example&lt;/h2&gt; &lt;p&gt;Depending on the project or organization, many code snippet candidates may exist. This may be a discrete chunk of code that you may reuse throughout the code (this also lends itself to a code library). In addition, the code may or may not include replaceable parameters that allow you to enforce a coding technique.&lt;/p&gt; &lt;p&gt;To demonstrate, I will create a code snippet that declares a set of objects for working with SQL Server. This allows a developer to insert and use these objects while saving typing time. Here is the C# code snippet:&lt;/p&gt; &lt;pre&gt;SqlConnection conn;&lt;/pre&gt; &lt;pre&gt;SqlCommand comm;&lt;/pre&gt; &lt;pre&gt;SqlDataAdapter sda;&lt;/pre&gt; &lt;p&gt;&lt;a target="_blank" href="http://techrepublic.com.com/html/tr/sidebars/6067392-0.html"&gt;&lt;strong&gt;Listing A&lt;/strong&gt;&lt;/a&gt; contains the appropriate code snippet XML. &lt;a target="_blank" href="http://techrepublic.com.com/html/tr/sidebars/6067392-1.html"&gt;&lt;strong&gt;Listing B&lt;/strong&gt;&lt;/a&gt; contains the equivalent code snippet definition for &lt;a href="http://VB.NET"&gt;VB.NET&lt;/a&gt;. Here's a closer look at the XML:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;A code snippet is defined by the CodeSnippet element. The CodeSnippets element is the root node, and it may contain one or more CodeSnippet elements.&lt;/li&gt;&lt;li&gt;The Description, Author, and Shortcut elements appear in the Code Snippets Manager window when it is highlighted. For this reason, the text included in the Description element should give a good idea of what the snippet actually does. In addition, the Shortcut element is what is typed within Visual Studio 2005 to actually use the snippet (type the shortcut and hit [Tab]).&lt;/li&gt;&lt;li&gt;The Code element contains the actual code associated with the snippet. In this example, there are no replaceable parameters used. The code is placed within the CDATA attribute.&lt;/li&gt;&lt;li&gt;The Language attribute of the Code element defines the code used. The options include VB, CSharp, VJSharp, and XML.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;You should create a folder to contain your custom code snippets and save this sample in the folder. The next step is to make it available in Visual Studio 2005.&lt;/p&gt; &lt;h2&gt;Adding a snippet to Visual Studio 2005&lt;/h2&gt; &lt;p&gt;The Code Snippets Manager allows you to easily add your own code snippets to the environment. To do so, you should follow these steps:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;Open the Manager window via the Tools | Code Snippets Manager menu selection.&lt;/li&gt;&lt;li&gt;Select the appropriate language in the Language field.&lt;/li&gt;&lt;li&gt;Click the Add button to add your snippet to the environment. This opens the Code Snippets Directory window that allows you to navigate to the folder containing the snippet file(s). You don't select the actual snippet file — the folder is selected and all snippets within it are added.&lt;/li&gt;&lt;li&gt;Once the directory is added, you can select it and browse the files within it.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;You can test it by typing the appropriate shortcut in Visual Studio 2005 and hitting [Tab] to insert the code, or you can right-click and select Insert Snippet from the context menu. This allows you to navigate the available code snippet directories to locate one if you don't know its shortcut. If you're using C#, you may also use the Surround With context menu option. This is just one way to tackle this simple example.&lt;/p&gt; &lt;h2&gt;More examples&lt;/h2&gt; &lt;p&gt;The Code Snippet XML Schema includes the optional Declarations element that you may use to specify the literals and objects for the code specified in the snippet. It might include zero or more Literal elements that you may use to define literals, and zero or more Object elements to define objects used in the code. Literal and Object elements contain ID, ToolTip, and Default elements to assign a name to the item, tooltip text, and its default value. In addition, the Object element contains the Type element to specify the type of object.&lt;/p&gt; &lt;p&gt;The Object and Literal elements are used in the actual code within the Code element. You reference the literals and objects you declared in the Declarations element by placing $ symbols at the beginning and end of the value in the literal or object's ID element. The VB snippet file in &lt;a target="_blank" href="http://techrepublic.com.com/html/tr/sidebars/6067392-2.html"&gt;&lt;strong&gt;Listing C&lt;/strong&gt;&lt;/a&gt; uses these elements to declare literals to be used in our code.&lt;/p&gt; &lt;p&gt;When you use this code snippet, green boxes appear around the literals enclosed in dollar signs ($connString$ and $sqlString$), which allow you to insert the appropriate text. The example code snippets in this column provide a peek at the creation process, but there is much more functionality available via the Code Snippet XML Schema.&lt;/p&gt; &lt;h2&gt;Importing code snippets&lt;/h2&gt; &lt;p&gt;While creating custom code snippets provides power and flexibility, you may also import snippets (created by you or others) to Visual Studio 2005 via the Import button in the Code Snippets Manager. This allows you to bring snippets into existing directories used by the Code Snippets Manager. You select the destination directories and select the Finish button. The process physically copies the snippet file to the destination directory.&lt;/p&gt; &lt;p&gt;Microsoft provides plenty of &lt;a target="_blank" href="http://msdn2.microsoft.com/en-us/vs2005/aa718338.aspx"&gt;Visual Studio 2005 code snippets&lt;/a&gt;, which you can download and import into your environment.&lt;/p&gt; &lt;h2&gt;Third-party tools&lt;/h2&gt; &lt;p&gt;It can be a bit tedious to create and edit XML files. It is especially cumbersome when you must know the syntax and order of a valid element that you may use in the snippet file. While Visual Studio 2005 does not include a snippet editor, there are code snippet editor tools available:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;a target="_blank" href="http://www.codeplex.com/snippy"&gt;Snippy — Visual Studio Code Snippet Editor&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/gusperez/articles/93681.aspx"&gt;Snippy — C# Code Snippet Editor&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Customize your environment&lt;/h2&gt; &lt;p&gt;Creating custom code snippets allows you to customize and streamline your development environment by making it easy to reuse standard coding elements and save typing. Use your favorite XML or text editor to create your own snippets and add them to Visual Studio 2005 to save valuable time.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: April 18th, 2008&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: Tony Patton &lt;/li&gt;&lt;/ul&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-3067709797421301152?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/3067709797421301152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=3067709797421301152' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/3067709797421301152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/3067709797421301152'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/create-custom-visual-studio-2005-code.html' title='Create custom Visual Studio 2005 code snippets'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-7272707035601269979</id><published>2008-12-23T12:34:00.001+05:00</published><updated>2008-12-23T12:34:46.527+05:00</updated><title type='text'>Visual Studio 2008 simplifies JavaScript debugging</title><content type='html'>&lt;p&gt;One of the more cumbersome development tasks is debugging client-side JavaScript code. Tools such as &lt;a target="_blank" href="http://blogs.techrepublic.com.com/programming-and-development/?p=477"&gt;Firebug&lt;/a&gt; are helpful, but in the case of Firebug, you're forced to use Firefox. Thankfully, Visual Studio 2008 provides a robust and developer-friendly environment for debugging JavaScript.&lt;/p&gt; &lt;h2&gt;Simplification&lt;/h2&gt; &lt;p&gt;Whenever I hear developers discuss the JavaScript debugger features in Visual Studio 2008, I notice that they're quick to point out that this type of functionality has been available in prior versions of the Visual Studio IDE for a long time. This is certainly true, but the improvements in Visual Studio 2008 make it much simpler to use.&lt;/p&gt; &lt;p&gt;The irritating aspect of &lt;a target="_blank" href="http://articles.techrepublic.com.com/5100-10878_11-6067987.html"&gt;JavaScript debugging&lt;/a&gt; in Visual Studio 2005 is that you have to first execute the application before any breakpoints can be created in your JavaScript. This approach has been modified in Visual Studio 2008 to allow breakpoints to be defined in the source code before the application runs. In fact, you can set them in both your C#/&lt;a href="http://VB.NET"&gt;VB.NET&lt;/a&gt; code as well as JavaScript. So, when the application is run, you can step through all breakpoints regardless of the code.&lt;/p&gt; &lt;h2&gt;Setup&lt;/h2&gt; &lt;p&gt;With Visual Studio 2008 installed, there is one additional requirement for enabling JavaScript debugging: Internet Explorer must have script debugging enabled. This setting is available via the Tools | Internet Options menu within Internet Explorer. Once the Internet Options dialog box is open, select the Advanced tab and the Disable Script Debugging option is located in the Browsing section. It should not be checked so that it is enabled. &lt;strong&gt;Figure A&lt;/strong&gt; shows the Disable Script Debugging option deselected.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Figure A&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://i.techrepublic.com.com/gallery/201528-412-516.jpg" alt="Figure A" title="Figure A"&gt;&lt;/p&gt; &lt;h6&gt;Figure A: Enabling script debugging in Internet Explorer&lt;/h6&gt; &lt;p&gt;With debugging feature enabled in Internet Explorer, you can start debugging your JavaScript code.&lt;/p&gt; &lt;h2&gt;Features&lt;/h2&gt; &lt;p&gt;The JavaScript debugger presents many standard debugging features. The following list provides a review of some of these features.&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;strong&gt;Breakpoints:&lt;/strong&gt; Breakpoints allow you to stop code execution at specific points within the source code. JavaScript breakpoints work just like C#/VB breakpoints.&lt;br&gt; Breakpoints are set/cleared by clicking to the left of the code within the IDE; by using the Debug menu or by using the Breakpoint Context menu available by right-clicking on the code. In addition, you may create conditional breakpoints to allow you to define conditions for the breakpoint, as well as set up a macro to run or a message to print when the breakpoint is triggered.&lt;br&gt; Breakpoints are viewable in the Watch window located by default in the lower left of Visual Studio 2008.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Call Stack:&lt;/strong&gt; The Call Stack tab in the lower right of Visual Studio 2008 allows you to view what is being called when the &lt;a href="http://ASP.NET"&gt;ASP.NET&lt;/a&gt; page is loaded/running.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Locals:&lt;/strong&gt; The Locals tab in the lower left of Visual Studio 2008 allows you to view the values of variables and objects during script execution. Also, you may change the contents of one of the local variables while the page is running.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Execute code:&lt;/strong&gt; The Immediate Window tab in the lower right of Visual Studio 2008 allows you to execute JavaScript code on-the-fly during page execution.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The Debug drop-down menu within Visual Studio 2008 provides a Windows submenu that allows you to define what windows to display while debugging. The examples in this article use Locals, Watch, Call Stack, and Immediate Window.&lt;/p&gt; &lt;p&gt;The most used feature during debugging is often breakpoints because you can use them to stop code execution and examine the state of variables and objects at that point in the script. Breakpoints provide a number of features (which are available via the Debug drop-down menu during a debugging session) for their use.&lt;/p&gt; &lt;p&gt;Code execution stops at each breakpoint — unless it is a conditional breakpoint whose condition has not been met. Once the code is halted, you may choose to continue one line at a time or until the next breakpoint is encountered.&lt;/p&gt; &lt;p&gt;The debugger is actually enabled via the Debug menu in Visual Studio 2008. You go to Debug | Start to begin a debugging session or press [F5]. A picture is worth a thousand words, so let's take a closer look at actually using the debugger.&lt;/p&gt; &lt;h2&gt;In action&lt;/h2&gt; &lt;p&gt;For a simple example, I have an &lt;a href="http://ASP.NET"&gt;ASP.NET&lt;/a&gt; page that includes three JavaScript functions. One function populates a DIV tag on the page with text passed to it. The second function displays text passed to it in a pop-up window via the alert function. The last function populates a DIV tag with the text "Loaded"; this function is called when the page first loads.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Figure B&lt;/strong&gt; shows this page running in debug mode. A breakpoint has been set on the line that populates a local variable with the contents of a DIV tag on the page. The red circle to the left of the line lets you know that it is a breakpoint. The line of code waiting to run is highlighted in yellow.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Figure B&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://i.techrepublic.com.com/gallery/201529-500-394.jpg" alt="Figure B" title="Figure B"&gt;&lt;/p&gt; &lt;h6&gt;Figure B: Sample page opened for debugging in Visual Studio 2008&lt;/h6&gt; &lt;p&gt;Also, a watch has been set on the divText variable, so the many properties associated with it are displayed in the Watch window at the bottom of the screen. Watches have been greatly enhanced in Visual Studio 2008 to include much more detail. You can now view runtime object's methods and events, as well as property and property type information.&lt;/p&gt; &lt;h2&gt;Dynamic nature&lt;/h2&gt; &lt;p&gt;A unique feature of JavaScript is its dynamic nature, whereas the code actually loaded in the browser when an application runs is often different than what is in the IDE. That is, the code is often generated as scripts may be stored as resources, loaded from other locations, or contained within other compiled controls.&lt;/p&gt; &lt;p&gt;The Script Documents feature of Visual Studio 2008 allows you to easily keep an eye on what is loaded and where it originated. While debugging, the Script Documents node will appear within the Solution Explorer pane. It will include the URL of each resource loaded into the page. It is visible in the upper right of Figure B.&lt;/p&gt; &lt;p&gt;Another note on the dynamic nature of JavaScript is the setting of breakpoints in the source code. Visual Studio 2008 automatically maps the breakpoint location to the dynamically generated page loaded in the browser. Likewise, if you set breakpoints in the executing page, the IDE performs the reverse mapping to update the breakpoints in the source code.&lt;/p&gt; &lt;h2&gt;Take a peek&lt;/h2&gt; &lt;p&gt;Debugging is an essential aspect of every developer's job. Debugging standard code has never been a problem, but working with JavaScript has always presented problems. Visual Studio 2008 eases the burden with an enhanced debugger that simplifies the chore of taking a look at what your JavaScript is actually doing at runtime.&lt;/p&gt; &lt;p&gt;What tools do you use to work with JavaScript? Do you plan on using Visual Studio 2008 to work with JavaScript now or in the future? Share your thoughts with the Web Developer community.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: May 15th, 2008&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: Tony Patton &lt;/li&gt;&lt;/ul&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-7272707035601269979?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/7272707035601269979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=7272707035601269979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/7272707035601269979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/7272707035601269979'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/visual-studio-2008-simplifies.html' title='Visual Studio 2008 simplifies JavaScript debugging'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-4958816374185596222</id><published>2008-12-23T12:33:00.001+05:00</published><updated>2008-12-23T12:33:46.545+05:00</updated><title type='text'>Why it’s impossible to become a programming expert</title><content type='html'>&lt;p&gt;The pace of change in the technology industry has made it nearly impossible to specialize in much or become an expert in anything. I started cluing in on this a few years ago when I was reading a lot about Lisp, but I simply didn't have time to try it out. Learning Lisp, and learning it well, requires a lot of reading, practice, trial and error, and so on. This would have been fine and dandy, but I wasn't doing this during my 9-5 job; this was just a "wouldn't it be neat to learn this?" type of project. A few months ago, my father and I were discussing the topic of expertise, and some of the things he said really clicked in my head.&lt;/p&gt; &lt;p&gt;Compare the amount of knowledge needed to really know C, Pascal, or maybe COBOL&amp;nbsp;to their modern business programming analogues of J2EE and .NET. There are a few commands, a few primitive types, and a few operators. Let's look at the libraries in 1991 as an example (1991 is the year I learned to program). Windows was just starting to penetrate the enterprise. A lot of programming was happening on mainframes. By and large, UIs were completely text based without a mouse. Input validation was a cinch; you simply looped over a "wait for input" statement until the user pressed one of the three valid buttons for that point in the program. Events? Nope. Object-oriented programming? Nope. Declarative UI definitions (HTML, XAML, etc.)? Nope. N-tiered architecture? Accessing resources over a network? Globalization? Nope, nope, and nope. Life was pretty darned simple.&lt;/p&gt; &lt;p&gt;It was a really nice transition from that world to the Perl/CGI world. At the end of the day, writing Perl in a CGI environment is conceptually very similar to writing a COBOL program: You take a batch of input, do your processing, and dump your output as a batch. It took roughly 50 printed pages to have enough Perl documentation, examples, "cookbook recipes," and so on to do the job at a decent level of competency. The experts were the folks who had been around long enough to understand issues such as SQL injection, and the need to properly escape encoded entities. At the time, I specialized in regular expressions. A few months of working with regular expressions (which are arguably a micro-language of their own), and I could read a regex like English. Over the next few years, I worked some real magic with them, from writing my own PHP-like system that fit my needs to working on screen scraping.&lt;/p&gt; &lt;p&gt;In 2001, I transitioned to Java. All of a sudden, I had some monolithic 1,000 page tome on my desk and 200 MB of HTML with minimal formatting on my hard drive — and these were just as reference sources. I ended up reading 500-700 pages of a "teach yourself Java" type of book. (In comparison, I read &lt;em&gt;&lt;a target="_blank" href="http://portal.acm.org/citation.cfm?id=526615"&gt;C in Plain English&lt;/a&gt;&lt;/em&gt; in three days — it was only a few hundred pages — without access to a C compiler, and I definitely qualified as "knowing" C.) The Java language has grown quite a bit since then; C# and &lt;a href="http://VB.NET"&gt;VB.NET&lt;/a&gt; are comparable in size and scope. I would guess that it would take at least 500 pages to adequately document (with examples and a thorough explanation of the techniques, usage scenarios for them, etc.) &lt;a href="http://VB.NET"&gt;VB.NET&lt;/a&gt;, C#, or Java. PHP is much less complex, thanks to its Perlish roots. We still haven't looked at the massive libraries that these systems carry with them; J2EE and the .NET Framework are both quite extensive. If anyone tells me that they are an expert in these systems, I know they are lying.&lt;/p&gt; &lt;p&gt;I have been working with the .NET Framework since 2003, and I am not an expert in the Framework. I am highly experienced with a few namespaces: System.Drawing, System.Threading, System.Net.Web, and System.Text.RegularExpressions. The rest of my time working with .NET has been so insanely spread out that I can't remember much of it. Thank goodness for Visual Studio's IntelliSense; at least with that, I can muddle through namespaces until I find what I need. If anyone were to watch me write code, they would assume that I am an idiot, since it would definitely look like I was grasping at straws 50% of the time. To be honest, that is what it feels like. Unfortunately, my "grasping at straws 50% of the time" still beats the industry average of 70% (I'm just making up numbers).&lt;/p&gt; &lt;p&gt;An expert programmer is no longer someone who is really knowledgeable or experienced. All too often, an expert programmer is the person who is adept at using a variety of reference tools&amp;nbsp;and&amp;nbsp;documentation&amp;nbsp;to find out how to achieve their goals. This is my secret sauce. I am really good at looking at a problem, figuring out &lt;em&gt;approximately&lt;/em&gt; what is wrong, and being able to quickly find the solution. To the uninitiated, it looks like sheer magic. To others, they say, "wow, Justin figured that out in only 30 minutes!" when they had been struggling with it all day. My real talent is knowing how to rapidly research and turn my findings into usable information. I suspect that I would be just as good at being a forensic accountant or a question writer for &lt;em&gt;Jeopardy!&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Most of the really good programmers I have met are the same way — they know a little of everything. They have tons of experiences that inform their "guiding light" when they look for answers. They have a natural talent, but overall, if you were to grill them on anything outside a narrow area (say, the System.Threading namespace), there is a really good chance that they will know where to get the answer from but not actually know the answer. Mark Cuban recently called this the &lt;a target="_blank" href="http://www.blogmaverick.com/2008/03/10/we-live-in-an-open-book-world-the-lie-of-information-overload/"&gt;"Open Book" World&lt;/a&gt;, and I tend to agree. Although for those of us in the IT industry, this happened 10 years ago; programmers (unlike network engineers and system administrators) have been able to touch radically new concepts with a simple download since about 1995. The eruption in new programming models, languages, frameworks, libraries, etc. closely tracks the adoption of the Internet. Between vendors and open source projects, it seems like another new "this will revolutionize how you program!" system is announced once a week or so. They all look worthy, but they take six months to learn really well, and I just can't devote my time to working with more than one at a time. So my choice is to either become barely familiar with a lot of things, or to commit myself to something that may not pan out.&lt;/p&gt; &lt;p&gt;For now, the "sampler platter approach" has been working well for me at the professional level, although I find it quite frustrating at the personal level. I miss learning things in depth. I miss the sense of satisfaction from attaining a level of expertise. I miss getting to explore obtuse and obscure areas of knowledge. But it simply does not match the reality of my work or that of most other programmers.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: May 27th, 2008&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: Justin James &lt;/li&gt;&lt;/ul&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-4958816374185596222?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/4958816374185596222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=4958816374185596222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/4958816374185596222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/4958816374185596222'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/why-its-impossible-to-become.html' title='Why it’s impossible to become a programming expert'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-8754253150671705120</id><published>2008-12-23T12:32:00.001+05:00</published><updated>2008-12-23T12:32:56.343+05:00</updated><title type='text'>Manager won’t hire moonlighters</title><content type='html'>&lt;div class="entry"&gt; 					&lt;p&gt;&lt;em&gt;A TechRepublic member has a problem with prospective employers who won't hire him because he has a side business. How should he handle it?&lt;/em&gt;&lt;/p&gt; &lt;p&gt;—————————————————————————————————————&lt;/p&gt; &lt;p&gt;In a blog this week I wrote about how to convince a prospective employer that &lt;a target="_blank" href="http://blogs.techrepublic.com.com/career/?p=340"&gt;you're not overqualified for a position&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;One of our TechRepublic members was frustrated by the fact that a couple of the people who interviewed him for a developer position refused to believe that he would be happy stepping down from the management position he currently held.&lt;/p&gt; &lt;p&gt;This week, another member wrote in with a similar complaint. In this case, prospective employers think some business endeavors he started while on a hiatus will interfere with any new full-time position he gets. Here's the scoop:&lt;/p&gt; &lt;p&gt;"I took a year's hiatus from IT and started up a few small businesses (consulting, web development) to keep me busy and to learn some new skills. Now that I'm back to looking for a job, employers question the 'self-employed' item in my resume. I don't want to leave the last year blank and I don't want to lie about what I've been doing for the past year. I was told flat out at one interview that they were already having problems with two staff who had their own business on the side and weren't interested in taking on any more - end of interview!"&lt;/p&gt; &lt;p&gt;My advice:&lt;/p&gt; &lt;p&gt;How nice that this interviewer was so eager to make an assumption about your work ethic based on his experience with other people! Unfortunately, this is pretty common. Most of the time when an employer makes a bad assumption about a job candidate, it's usually because they've been burned by a similar situation before. It's not fair, but that's why it happens.&lt;/p&gt; &lt;p&gt;The interviewer is assuming that you have money and sweat equity wrapped up in your companies, and that you'll surely want to keep them afloat. And, in his experience, that means you will probably use company time to make that happen. This is also a shame for him because he's missing out on a lot of good employees — a pretty good percentage of IT moonlight.&lt;/p&gt; &lt;p&gt;I wonder how your side businesses are presented in your resume, and if there is any way to refer to the experience gained from the endeavors without referring to them as "side businesses." That is, instead of saying that from 2006-2007, you started a Web development business, maybe you could say that during that time period you consulted on Web developments issues. The latter speaks about your experience and expertise without implying that it is a business that requires attention that would take you away from a job. It may appear that you are withholding information, but you're actually just spinning it so the information will be more agreeable to anyone looking at it.&lt;/p&gt; &lt;p&gt;It's a shame that the initiative that you showed during your time off is being held against you. I hope things work out, or at least you interview with a manager who hasn't been burned by freelancers before.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: June 27th, 2008&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: Toni Bowers &lt;/li&gt;&lt;/ul&gt; 					 				&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-8754253150671705120?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/8754253150671705120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=8754253150671705120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/8754253150671705120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/8754253150671705120'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/manager-wont-hire-moonlighters.html' title='Manager won’t hire moonlighters'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-785335365818525957</id><published>2008-12-23T12:30:00.001+05:00</published><updated>2008-12-23T12:30:33.739+05:00</updated><title type='text'>AJAX should not mandate HTTP</title><content type='html'>&lt;p&gt;An interesting and unfortunate by-product of AJAX applications is that these applications rely upon the existence of an application server always being available. Many Web users are used to the idea that they can save a Web page to be read at their convenience. Even when there is Flash on the page, the page still works offline. After all, HTML is simply a document storage format, and HTTP is simply a protocol designed to optimally transmit HTML documents. But, in reality, more and more Web developers are assuming that the user will not want to save the Web page or lose network connectivity. I think that this is a mistake.&lt;/p&gt; &lt;p&gt;A lot of frameworks have come out recently that are designed to tackle the offline problem; the frameworks' approach is usually to run a database on the client. The database can cache data from the "home server," and if the user makes changes while offline, that database can write the changes back to the "home server" when it becomes available again. These frameworks don't do anything about all of the back and forth requests to the app server that AJAX applications generate.&lt;/p&gt; &lt;p&gt;Some developers try to tackle this problem by loading a miniature application server on the client via Java (or similar "applet" style technologies). This approach works. However, after a certain point, I wonder how many hoops someone needs to jump through to compensate for an inherent shortcoming of a particular technique before it becomes clear that a technique might not meet their needs.&lt;/p&gt; &lt;p&gt;Even assuming that you can put a miniature application server and database server on the client that can cache and sync with the master servers whenever possible, you still have not solved the problem of "saving a Web page." The user doesn't think they are using an "application"; if it runs in a Web browser, they treat it like a Web page. Users are always clicking the Back button (which messes up AJAX apps) because they expect it to work like the Undo button. And incidentally, it &lt;em&gt;does&lt;/em&gt; work like the Undo button in a more traditional step-by-step forms-based application. Ironically, one of the biggest issues that AJAX addresses in traditional Web development is the stateless nature of the HTTP protocol — and yet it suffers from its own lack of state.&lt;/p&gt; &lt;p&gt;Let's take a "product finder" application as an example. In the application, the user selects various options as "must have" and "nice to have" features. Some of these are Boolean selections, while others might be numeric ranges, and one or two might be "one-of-many" or "many-of-many" options. Now, let's imagine that our user has narrowed her choices down to four products from the original 50. She decided to save the Web page to disk so she can e-mail it to her boss or coworkers for review. Whoops! Her boss and coworkers will likely have a problem if they try to bookmark the page or e-mail the link. In a traditional Web application, if the developer is smart, he or she will use GET rather than POST for these scenarios to ensure that the link accurately represents the application's state, and the page is quite easily saved in its current state.&lt;/p&gt; &lt;p&gt;I am not saying that AJAX applications cannot function like this; however, until users get used to the idea that the traditional model no longer applies, developers will want to find smart and creative ways of addressing this issue. One way of doing this would be to periodically "tag" the state with a hash code and redirect the browser to a URL that calls that hash code (for example, &lt;a href="http://www.site.com/application/j7qw132j"&gt;http://www.site.com/application/j7qw132j&lt;/a&gt;). This way, if the user hits the Back button, she goes back, say, two minutes in time (or 10 operations) rather than back to the beginning. Also, the user can e-mail (or bookmark) that link. Developers often build in E-mail This Page, Bookmark This Page, or even Save This Page buttons on their site, but it takes effort to build in the buttons, and users often miss those buttons or assume that they do the same thing as the similarly labeled browser functions.&lt;/p&gt; &lt;p&gt;I think that developers who work hard can find some creative, workable, and usable solutions for this issue, and their users will appreciate it.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: May 30th, 2008&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: Justin James &lt;/li&gt;&lt;/ul&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-785335365818525957?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/785335365818525957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=785335365818525957' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/785335365818525957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/785335365818525957'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/ajax-should-not-mandate-http.html' title='AJAX should not mandate HTTP'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-5974472478960919659</id><published>2008-12-23T12:27:00.001+05:00</published><updated>2008-12-23T12:27:12.349+05:00</updated><title type='text'>Cyber-bullying- the impact and the consequence</title><content type='html'>&lt;p&gt;This is a difficult story on many fronts. In reading the facts, it is hard to believe that this kind of thing can happen. There may be a desire to blame the victim- who should have been "smarter." There is also a desire to shake the perpetrator who clearly should have known better. But perhaps it is a cautionary tale that we can all learn something from on many levels- not only personal, but from a corporate standpoint as well.&lt;/p&gt; &lt;p&gt;On May 15, 2008, a federal grand jury indicted Lori Drew, 49, of O'Fallon, Missouri with one count of conspiracy and three counts of unauthorized computer access. If convicted, each count could net Ms Drew five years.&lt;/p&gt; &lt;p&gt;Why does this matter?&lt;/p&gt; &lt;p&gt;Allegedly, Ms. Drew, her 13 year old daughter, and Ms Ashley Grillis, 18, who was employed by the Drew family, created a fictitious MySpace profile for the purpose of harassing Megan Meier, a teenaged girl living on the same block as Drew and her family.&lt;/p&gt; &lt;p&gt;For the next four weeks, a flirtatious relationship blossomed between Ms Meier and the fictitious person that Drew and Grillis created. And then it suddenly ended with the fictitious person telling Megan "The world would be a better place without you." Megan hung herself in her bedroom about an hour later.&lt;/p&gt; &lt;p&gt;State lawmakers gave final approval on May 17th to a bill intended to deal with cyber-harassment. This bill is expected to cover several aspects of technology, identifying as illegal the harassment from computers, text messages, and other electronic devices as well as standard written and telephone communications.&lt;/p&gt; &lt;p&gt;From &lt;a href="http://www.efluxmedia.com/news_MySpace_Suicide_Case_Leads_To_Tougher_Laws_17707.html" title="eFlux Media" target="_blank"&gt;eFlux Media&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;Republican Governor Matt Blunt, who will soon sign the final version of the bill, issued a statement saying that the social networking sites and technology have provided criminals with a whole new set of weapons against their victims and the new protections and penalties are highly needed in order to ensure a safer environment for everyone.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;While this case is certainly tragic, it is thankfully not the norm in social networking- a phenomenon that is taking the web, and business, by storm.&lt;/p&gt; &lt;p&gt;What it tells us is that there are definitely boundaries, and states are now recognizing those boundaries and stepping up to set laws in place to enforce those boundaries.&lt;/p&gt; &lt;p&gt;Blogs, wikis, and other social networking tools are beginning to find their way into the business corporate culture. They are useful tools for communication and collaboration between business partners in both the internal and external corporate structure and will continue to grow. According to Forrester Research, the foundation technology, Web 2.0, will cost business US$4.6 billion over the next five years, making Web 2.0 hotter in terms of growth than the area of business intelligence.&lt;/p&gt; &lt;p&gt;I can see that.  Seems like everyone I meet wants to add me to one friend list or another.&lt;/p&gt; &lt;p&gt;But as business embraces social networking, one thing is clear. They will have to embrace some policy definitions along with the tools to insure that employees understand where the lines are firmly drawn.&lt;/p&gt; &lt;p&gt;Does your business use any kind of social networking tools? Do you have a community blog on your intranet or use a wiki to explain the workplace jargon? &lt;a href="http://techrepublic.com.com/5208-6230-0.html?forumID=102&amp;amp;threadID=263884" title="TR Discussion" target="_blank"&gt;How does business set the standards for your communication?&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt; &lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: May 19th, 2008&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: Tricia Liebert &lt;/li&gt;&lt;/ul&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-5974472478960919659?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/5974472478960919659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=5974472478960919659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5974472478960919659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5974472478960919659'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/cyber-bullying-impact-and-consequence.html' title='Cyber-bullying- the impact and the consequence'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-417385967389091883</id><published>2008-12-23T12:26:00.001+05:00</published><updated>2008-12-23T12:26:13.731+05:00</updated><title type='text'>Alpha Five: Data-driven application development done right</title><content type='html'>&lt;div class="entry"&gt;&lt;br&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a target="_blank" href="http://www.alphasoftware.com/"&gt;Alpha Software&lt;/a&gt; specializes in creating tools that let developers easily create data-driven applications. Richard Rabins (Co-Chairman) and his brother Selwyn Rabins (CTO) showed me the ropes on the latest version of its &lt;a target="_blank" href="https://www.alphasoftware.com/shop/alphafive/v9/"&gt;Alpha Five&lt;/a&gt; development package, and I'm pretty impressed.&lt;/p&gt; &lt;h2&gt;What is Alpha Five?&lt;/h2&gt; &lt;p&gt;Alpha Five is a package that allows developers to rapidly and easily create data-driven applications. I know… we've all heard this promise a dozen times before, so now we're pretty jaded by it. In this case, I am inclined to believe that someone got the formula right. From the demonstrations that I saw, Alpha Five "connects the dots" that most of the mainstream products just simply leave unconnected.&lt;/p&gt; &lt;p&gt;For example, we're all familiar with the pain of putting together the standard master grid/detail view with a search box Web page. Here is a great example of the benefits of Alpha Five that I saw in action. Let's say that you need to put a grid component on the screen and bind it to a data view and a detail view component. So you bind the detail view to a data view and bind that data view to the selected item in the master data view. Next, you make a search area, add the validation, and add its information to the master data view's filter. It is a formulaic piece of code, yet we repeatedly keep writing it. The code usually takes about 30 minutes to create and tidy up — or even longer if you are not familiar with it.&lt;/p&gt; &lt;p&gt;Alpha Five makes this much easier. Instead, you put a grid component on the form, check a box to indicate that you want a detail view, and then select the fields for the master data view and the detail view. For the search area, check off fields to be "lookup" and add the constraints on the values entered. In less than 60 seconds, I saw Richard put together a form that always takes me 30 minutes.&lt;/p&gt; &lt;p&gt;In a nutshell, the folks at Alpha Software asked, "What are the top X tasks that developers do that involve gluing standard components together in the same way day in and day out?" Then they took that list, wrote their own version of the components, and made those standard "cookbook recipe" combinations into component properties. My first reaction when I watched Richard and Selwyn show this off was, "Wow, this makes it a snap to write that standard CRUD Web application that I keep being asked to write!"&lt;/p&gt; &lt;p&gt;They also showed off the company's Script Genie; it reminds me a lot of Outlook's Rules Wizard, but it generates code. Script Genie looks pretty slick: You select the actions that you want to take in response to various events. Then, you provide the parameters to the actions by selecting the properties of the objects that would be in scope and are appropriate. For example, you can use Script Genie to hook onto a button being clicked, select the Send Email action, and tell it to get the subject line from a configuration file and the body from a field on the screen.&lt;/p&gt; &lt;p&gt;Regular readers know that &lt;a target="_blank" href="http://blogs.techrepublic.com.com/programming-and-development/?p=46"&gt;I'm not a huge fan of AJAX&lt;/a&gt;. However, the AJAX libraries that Richard and Selwyn showed me seem to be high quality and worked as promised. Of course, you still need to cope with the usual AJAX problems (like constantly hitting the Web server, but at least Alpha Five uses persistent TCP/IP connections which helps); but if you need to use AJAX, Alpha Five's libraries look pretty good.&lt;/p&gt; &lt;h2&gt;The technical details&lt;/h2&gt; &lt;p&gt;Alpha Five can make desktop apps (that are interpreted through a runtime system, similar to the JVM or .NET CLR) or Web apps. (Alpha Software's application server can run side-by-side with IIS, and the company is working on a clustering application server, as well as a non-Windows version.) The Web system makes pages similar to PHP, ASP, or JSP, with the A5 tags embedded in between HTML. The language Alpha Software uses is XBASIC, a variant of BASIC.&lt;/p&gt; &lt;p&gt;For database connectivity, the &lt;a target="_blank" href="https://www.alphasoftware.com/shop/alphafive/v9/"&gt;Alpha Five Standard Edition&lt;/a&gt; uses its own database engine; the &lt;a target="_blank" href="https://www.alphasoftware.com/shop/alphafive/v9/"&gt;Alpha Five Platinum Edition&lt;/a&gt; supports other databases. Like Cognos, Alpha Software's tools produce a "standardized SQL," which then gets translated to the appropriate SQL statements depending upon which SQL driver you use. (&lt;strong&gt;Note:&lt;/strong&gt; You can use ODBC if you want, but Alpha Software has brewed its own drivers for databases that are faster since they don't have ODBC's overhead.)&lt;/p&gt; &lt;p&gt;A while back, I came to realize that most data-driven applications can be done in Microsoft Access or FoxPro; there's a thin veneer of data validation and business logic on top of a 10 - 30 table database — nothing too complex. Tools like Ruby on Rails address this and so does Alpha Five.&lt;/p&gt; &lt;p&gt;Richard admits that Alpha Five is not a "kitchen sink" system like J2EE or .NET. But from what I saw, it can handle about 80% of the applications most developers write with significantly less effort than J2EE, PHP, or .NET require. By focusing on the stuff that most developers spend all day on (instead of what a few developers spend a little bit of time on), the Alpha Software team has created a system that does exactly what most developers need. Watching Richard and Selwyn go through the motions of using it, programmers will still need to write code by hand, but they wouldn't need to write as much code.&lt;/p&gt; &lt;h2&gt;Data binding done right&lt;/h2&gt; &lt;p&gt;We all know how I usually feel about these systems. I like to throw phrases out there like "shake 'n bake programmers" and knock "drag 'n drop data binding." I'll be the first to admit that years of hearing vendors promise "systems so easy, your secretary will be writing her own applications!" that I just don't believe it. What I saw of Alpha Five wasn't an attempt to get the secretary to be writing Web applications, but it was something that lets a programmer leverage his or her time better.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: June 5th, 2008&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: Justin James &lt;/li&gt;&lt;/ul&gt; 					 				&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-417385967389091883?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/417385967389091883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=417385967389091883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/417385967389091883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/417385967389091883'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/alpha-five-data-driven-application.html' title='Alpha Five: Data-driven application development done right'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-377947109462689163</id><published>2008-12-23T11:05:00.001+05:00</published><updated>2008-12-23T11:05:40.592+05:00</updated><title type='text'>Installing a simple Web server on Windows Server 2008 from a script</title><content type='html'>&lt;div class="entry"&gt; 					&lt;p&gt;&lt;em&gt;While there are more advanced Web server configurations, many products require the IIS Web engine as a prerequisite. Here's how to install a simple IIS Web server through a scripted role.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;——————————————————————————————————————-&lt;/em&gt;&lt;/p&gt; &lt;p&gt;You can usually add features through the Windows Server 2008 Server Manager snap-in via a script. In the case of IIS 7.0, there are many options available for the feature install.&lt;/p&gt; &lt;p&gt;One way to ensure a consistent configuration for applications that require IIS (e.g., SQL Server) is to use a scripted installation. For IIS, the package manager can install the features locally. To install a basic IIS configuration, run the following script:&lt;/p&gt; &lt;pre&gt;start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServerManagementTools;&lt;br&gt;IIS-ManagementService;IIS-Metabase;WAS-WindowsActivationService;&lt;br&gt;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI&lt;/pre&gt; &lt;p&gt;The command provides little interaction and, by default, does not provide feedback of any type if an incorrect parameter is passed after the &lt;em&gt;/iu&lt;/em&gt; parameter. &lt;strong&gt;Figure A&lt;/strong&gt; shows IIS being added via the script.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Figure A&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://i.techrepublic.com.com/gallery/220013-500-102.jpg" alt="Figure A" title="Figure A"&gt;&lt;/p&gt; &lt;p&gt;Once the scripted task completes after a minute or so, and the Window Server 2008 Server Manager snap-in performs its next refresh, the Web server is listed as a role on the system and is running. &lt;strong&gt;Figure B&lt;/strong&gt; shows an updated Server Manager snap-in with this basic IIS role.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Figure B&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://i.techrepublic.com.com/gallery/220014-500-474.jpg" alt="Figure B" title="Figure B"&gt;&lt;/p&gt; &lt;p&gt;Using this scripted install of IIS is a good way to ensure consistent server build configurations, and other Windows features can be automated through the package manager (pkgmgr). The package manager can also uninstall packages, which may be helpful for temporarily enabling a feature for a specified amount of time and for removing the feature from a scheduled task to ensure its decommissioning.&lt;/p&gt; &lt;p&gt;For more information on the package manager, read the TechNet article &lt;a target="_blank" href="http://technet.microsoft.com/en-us/library/cc749465.aspx"&gt;Package Manager Command-Line Options&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Stay on top of the latest Windows Server 2003 and Windows Server 2008 tips and tricks with our free Windows Server newsletter, delivered each Wednesday. &lt;a href="http://nl.com.com/MiniFormHandler?brand=techrepublic&amp;amp;list_id=e071"&gt;Automatically sign up today! &lt;br&gt;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;&lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: September 23rd, 2008&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: Rick Vanover &lt;/li&gt;&lt;/ul&gt; 					 				&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-377947109462689163?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/377947109462689163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=377947109462689163' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/377947109462689163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/377947109462689163'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/installing-simple-web-server-on-windows.html' title='Installing a simple Web server on Windows Server 2008 from a script'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-5862039678898852586</id><published>2008-12-23T11:02:00.001+05:00</published><updated>2008-12-23T11:02:58.264+05:00</updated><title type='text'>Phorm’s Webwise: It’s back and gaining traction</title><content type='html'>It appears that the company &lt;a target="_blank" href="http://www.phorm.com/" title="Phorm"&gt;Phorm&lt;/a&gt; and its application &lt;a target="_blank" href="http://www.webwise.com/" title="webwise"&gt;Webwise&lt;/a&gt; are alive and well. Phorm and several major British ISPs are putting a new spin on Webwise and how it will make everyone's Internet experience better. For instance this is &lt;a target="_blank" href="http://www2.bt.com/static/i/btretail/webwise/" title="BT take"&gt;British Telecommunications Group's&lt;/a&gt; (BT) take on Webwise: &lt;blockquote&gt;&lt;p&gt;&lt;em&gt;"BT Webwise increases your protection against online fraud and makes ads that appear on participating websites more relevant to your interests. It's completely free for BT Total Broadband customers and you don't have to download or install any software for it to work.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;BT Webwise automatically adds an additional layer of protection against online fraud by checking the sites you visit against a list of suspected fraudulent and untrustworthy websites. When you attempt to visit any website on the list, you'll see a warning, so you can choose whether or not to visit it. It's another way BT is helping to protect you online."&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;It's free?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Webwise requires massive amounts of hardware and software to check every single bit of network traffic that passes through the ISP. So, if you're wondering why an ISP would offer this service for free, wonder no longer. BT explains that your advertising (hint hint) experience will be more personal:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;&lt;em&gt;"BT Webwise also personalizes the online advertising you see when browsing on participating websites by linking ads to your interests. For example, if you search for a weekend trip to Paris or visit pages related to Paris, BT Webwise would replace the standard ads that would normally appear with advertising relating to travel or hotels information. You won't see any more adverts than you normally do — they'll simply be more relevant."&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;The reason it's free to the ISP members is that Webwise will become a major revenue stream for the ISP. As I understand the process, advertisers will pay Phorm and Phorm will then pay the ISPs. So, the ISPs are hoping that members will go along with it.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Some history&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Back in July of this year I wrote two articles about new technology that has the potential to track and shape everyone's Internet traffic. "&lt;a target="_blank" href="http://blogs.techrepublic.com.com/networking/?p=609" title="DPI"&gt;Deep Packet Inspection: What You Need to Know&lt;/a&gt;" discusses technology that enables real-time deep packet inspection (DPI) of traffic. DPI has allowed companies to develop behavioral targeting applications that can shape traffic and inject third-party vendor (TPV) advertisements. The article "&lt;a target="_blank" href="http://blogs.techrepublic.com.com/networking/?p=612" title="Behavioral Targeting"&gt;Behavioral Targeting: What You Need to Know&lt;/a&gt;" discusses one such company, Phorm, and its traffic-shaping application Webwise.&lt;/p&gt;  &lt;p&gt;Just to keep all of us on the same page, a high-level view of behavioral targeting might be helpful. Briefly, behavioral targeting first determines what you like, based on where you go on the Internet. Then, behavioral targeting selects advertisements that are most likely to influence you, displaying them on the new Web pages you ask for.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Back to the infamous cookie yet again&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;If your ISP uses Webwise, your browser is given a cookie from the Webwise Web site, even though the Webwise site was never visited. This cookie contains a unique identifying number (UID), which identifies you to the advertising network. Then every time you surf to a new Web site, the UID along with information about that Web site is captured by Webwise. The UID is then compared to a database of previously visited Web sites and information about your browsing habits. After which Webwise will return what it considers relevant advertising information to your Web browser.&lt;/p&gt; &lt;p&gt;Phorm is supposedly making Webwise an opt-in option now, which appears to be satisfying some of the privacy advocates. The reason I say some is that Webwise still installs a UID cookie for every Web page that you visit, even if you have opted out. Webwise still has to monitor all your surfing as it's the only way the application can read the opted-out status of the cookie.&lt;/p&gt; &lt;p&gt;Therein lays the crux of the matter — mission creep. The ISP and Phorm can potentially track your whole Internet experience. Since DPI is being used, the tracking and scanning of information isn't limited to Web browsing. E-mail and virtually any traffic of interest could be captured and analyzed.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Which ISPs are involved?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;As of now &lt;a target="_blank" href="http://www2.bt.com/static/i/btretail/webwise/index.html" title="BT"&gt;BT&lt;/a&gt;, &lt;a target="_blank" href="http://www.virginmedia.com/customers/webwise.php" title="Virgin Media"&gt;Virgin Media&lt;/a&gt;, and &lt;a target="_blank" href="http://webwise.phorm.com/talktalk_webwise_pilot.php" title="Talk Talk"&gt;TalkTalk&lt;/a&gt; have conducted tests or are in the process of testing. All indications are that the ISPs will in the near future launch the Webwise program.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Preventative measures&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;There are options that you can use to avoid behavioral targeting cookies and DPI scrutiny. Encrypted tunnels through your ISP disallow the installation of behavioral targeting cookies. Also using VPNs, whether they are IPsec, L2TP, or SSL, will negate any effort by DPI to decipher the encrypted traffic. E-mail is another subject, and once again the only sure way to ensure its privacy is to encrypt the message. There are not a whole lot of options, but that's because behavioral targeting applications are being placed only one hop away from your network perimeter.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Final thoughts&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Whether this technology gains traction or not is going to depend on the legality of it and whether people are comfortable with having their Internet experience monitored. It appears that the British government doesn't consider it a &lt;a target="_blank" href="http://www.theregister.co.uk/2008/09/22/bt_phorm_police_drop/" title="privacy"&gt;privacy&lt;/a&gt; or &lt;a target="_blank" href="http://www.publications.parliament.uk/pa/ld200708/ldhansrd/text/81118w0002.htm" title="copyright"&gt;copyright&lt;/a&gt; issue. It will be interesting to see if the new spin Phorm is placing on Webwise will be sufficient to overcome member concern about privacy issues.&lt;/p&gt; &lt;p&gt;Regarding the members of the the three ISPs, I recently read the Register's article "&lt;a target="_blank" href="http://www.theregister.co.uk/2008/11/19/bt_phorm_censor/" title="Censor"&gt;BT Silences Customers over Phorm&lt;/a&gt;." One has to wonder about the logic behind that. I suspect it will be interpreted as BT having something to hide.&lt;/p&gt;  &lt;p&gt;Need help keeping systems connected and running at high efficiency? Delivered Monday and Wednesday, TechRepublic's Network Administrator newsletter has the tips and tricks you need to better configure, support, and optimize your network. &lt;a target="_blank" href="http://nl.com.com/MiniFormHandler?brand=techrepublic&amp;amp;list_id=e102" title="sign up"&gt;&lt;em&gt;Automatically sign up&lt;/em&gt;&lt;/a&gt; today!&lt;/p&gt;&lt;ul class="postData"&gt;&lt;li&gt;&lt;strong&gt;Date&lt;/strong&gt;: December 22nd, 2008&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: Michael Kassner &lt;/li&gt;&lt;li&gt;Ref: &lt;a href="http://blogs.techrepublic.com.com/networking/?p=768&amp;amp;tag=nl.e102"&gt;http://blogs.techrepublic.com.com/networking/?p=768&amp;amp;tag=nl.e102&lt;/a&gt; &lt;br&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-5862039678898852586?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/5862039678898852586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=5862039678898852586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5862039678898852586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5862039678898852586'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/12/phorms-webwise-its-back-and-gaining.html' title='Phorm’s Webwise: It’s back and gaining traction'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-2789434490486363463</id><published>2008-11-25T13:34:00.001+05:00</published><updated>2008-11-25T13:34:13.863+05:00</updated><title type='text'>Success in Ur Official Carrier Tips</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/_Qi0BBZfnzVg/SSu4hnLiMGI/AAAAAAAAADY/yKPJiso5wn4/s1600-h/join__Friends-kingdom__01-753865.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_Qi0BBZfnzVg/SSu4hnLiMGI/AAAAAAAAADY/yKPJiso5wn4/s320/join__Friends-kingdom__01-753865.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5272510676359852130" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/_Qi0BBZfnzVg/SSu4hm5uLEI/AAAAAAAAADg/_f-iPxf9KjI/s1600-h/join__Friends-kingdom__02-754387.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_Qi0BBZfnzVg/SSu4hm5uLEI/AAAAAAAAADg/_f-iPxf9KjI/s320/join__Friends-kingdom__02-754387.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5272510676285140034" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/_Qi0BBZfnzVg/SSu4hwSjWbI/AAAAAAAAADo/K5zw-86CdSs/s1600-h/join__Friends-kingdom__03-755875.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/_Qi0BBZfnzVg/SSu4hwSjWbI/AAAAAAAAADo/K5zw-86CdSs/s320/join__Friends-kingdom__03-755875.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5272510678805207474" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/_Qi0BBZfnzVg/SSu4ifrCamI/AAAAAAAAADw/svzscDMsYKI/s1600-h/join__Friends-kingdom__04-757337.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_Qi0BBZfnzVg/SSu4ifrCamI/AAAAAAAAADw/svzscDMsYKI/s320/join__Friends-kingdom__04-757337.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5272510691524373090" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/_Qi0BBZfnzVg/SSu4ih5XuRI/AAAAAAAAAD4/Rs6EAvihy5M/s1600-h/join__Friends-kingdom__05-758067.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_Qi0BBZfnzVg/SSu4ih5XuRI/AAAAAAAAAD4/Rs6EAvihy5M/s320/join__Friends-kingdom__05-758067.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5272510692121360658" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/_Qi0BBZfnzVg/SSu4iinR_lI/AAAAAAAAAEA/7CeeHUXn6Qc/s1600-h/join__Friends-kingdom__06-758878.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_Qi0BBZfnzVg/SSu4iinR_lI/AAAAAAAAAEA/7CeeHUXn6Qc/s320/join__Friends-kingdom__06-758878.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5272510692313923154" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/_Qi0BBZfnzVg/SSu4i-mPQNI/AAAAAAAAAEI/S-85q3oA07o/s1600-h/join__Friends-kingdom__07-759253.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/_Qi0BBZfnzVg/SSu4i-mPQNI/AAAAAAAAAEI/S-85q3oA07o/s320/join__Friends-kingdom__07-759253.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5272510699825742034" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/_Qi0BBZfnzVg/SSu4i2T3hZI/AAAAAAAAAEQ/P8mT8Q5BeC8/s1600-h/join__Friends-kingdom__08-759779.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/_Qi0BBZfnzVg/SSu4i2T3hZI/AAAAAAAAAEQ/P8mT8Q5BeC8/s320/join__Friends-kingdom__08-759779.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5272510697601205650" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/_Qi0BBZfnzVg/SSu4jGNjcuI/AAAAAAAAAEY/LkKf0jkBHFc/s1600-h/join__Friends-kingdom__09-760836.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_Qi0BBZfnzVg/SSu4jGNjcuI/AAAAAAAAAEY/LkKf0jkBHFc/s320/join__Friends-kingdom__09-760836.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5272510701869691618" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/_Qi0BBZfnzVg/SSu4jQD2frI/AAAAAAAAAEg/8oCsgWMDzKA/s1600-h/join__Friends-kingdom__10-761937.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_Qi0BBZfnzVg/SSu4jQD2frI/AAAAAAAAAEg/8oCsgWMDzKA/s320/join__Friends-kingdom__10-761937.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5272510704513351346" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/_Qi0BBZfnzVg/SSu4j5afnfI/AAAAAAAAAEo/UQUg5M5eQ3U/s1600-h/join__Friends-kingdom__11-763297.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/_Qi0BBZfnzVg/SSu4j5afnfI/AAAAAAAAAEo/UQUg5M5eQ3U/s320/join__Friends-kingdom__11-763297.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5272510715614174706" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-2789434490486363463?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/2789434490486363463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=2789434490486363463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/2789434490486363463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/2789434490486363463'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/11/success-in-ur-official-carrier-tips.html' title='Success in Ur Official Carrier Tips'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Qi0BBZfnzVg/SSu4hnLiMGI/AAAAAAAAADY/yKPJiso5wn4/s72-c/join__Friends-kingdom__01-753865.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-7498693195260307419</id><published>2008-11-25T11:07:00.002+05:00</published><updated>2008-11-25T11:12:59.754+05:00</updated><title type='text'>Success in Ur Official Carrier__Tips</title><content type='html'>&lt;div class="gmail_quote"&gt;&lt;div&gt;&lt;div style="font-family: times new roman,new york,times,serif; font-size: 10pt;"&gt;&lt;div style="font-family: times new roman,new york,times,serif; font-size: 10pt;"&gt;&lt;div style="font-family: times new roman,new york,times,serif; font-size: 12pt;"&gt; &lt;p align="center"&gt;&lt;a rel="nofollow" href="#" target="_blank"&gt;&lt;img  src="cid:2.2504768559@web33203.mail.mud.yahoo.com" width="420" height="315" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a rel="nofollow" href="#" target="_blank"&gt;&lt;img  src="cid:3.2504768559@web33203.mail.mud.yahoo.com" width="420" height="315" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a rel="nofollow" href="#" target="_blank"&gt;&lt;img  src="cid:4.2504768559@web33203.mail.mud.yahoo.com" width="420" height="315" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a rel="nofollow" href="#" target="_blank"&gt;&lt;img  src="cid:5.2504768559@web33203.mail.mud.yahoo.com" width="420" height="315" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a rel="nofollow" href="#" target="_blank"&gt;&lt;img  src="cid:6.2504768559@web33203.mail.mud.yahoo.com" width="420" height="315" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a rel="nofollow" href="#" target="_blank"&gt;&lt;img  src="cid:7.2504768559@web33203.mail.mud.yahoo.com" width="420" height="315" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a rel="nofollow" href="#" target="_blank"&gt;&lt;img  src="cid:8.2504768559@web33203.mail.mud.yahoo.com" width="420" height="315" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a rel="nofollow" href="#" target="_blank"&gt;&lt;img  src="cid:9.2504768559@web33203.mail.mud.yahoo.com" width="420" height="315" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a rel="nofollow" href="#" target="_blank"&gt;&lt;img  src="cid:10.2504768560@web33203.mail.mud.yahoo.com" width="420" height="315" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a rel="nofollow" href="#" target="_blank"&gt;&lt;img  src="cid:11.2504768560@web33203.mail.mud.yahoo.com" width="420" height="315" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;a rel="nofollow" href="#" target="_blank"&gt;&lt;img  src="cid:12.2504768560@web33203.mail.mud.yahoo.com" width="420" height="315" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p align="center"&gt; &lt;/p&gt;&lt;p align="center"&gt; &lt;/p&gt;&lt;p align="center"&gt; &lt;/p&gt;&lt;p align="center"&gt; &lt;/p&gt;&lt;p align="center"&gt; &lt;/p&gt;&lt;p align="center"&gt; &lt;/p&gt;&lt;p align="center"&gt; &lt;/p&gt;&lt;p align="center"&gt; &lt;/p&gt;&lt;br /&gt;&lt;p align="center"&gt; &lt;/p&gt;&lt;p align="center"&gt; &lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;          &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-7498693195260307419?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/7498693195260307419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=7498693195260307419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/7498693195260307419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/7498693195260307419'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/11/success-in-ur-official-carriertips_25.html' title='Success in Ur Official Carrier__Tips'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-80993407897180464</id><published>2008-10-31T10:44:00.001+06:00</published><updated>2008-10-31T10:44:53.549+06:00</updated><title type='text'>Use Cases writing Tips</title><content type='html'>&lt;b&gt;Use Case Definition: &lt;br&gt;&lt;br&gt;&amp;quot; &lt;/b&gt;A Use case us the specification of a set of actions performed by a system, which yields an observable result that is, typically, of value for one or more actors or other stake holders of the system (UML 2) &lt;b&gt;&amp;quot;&lt;br&gt; &lt;br&gt;TIPS:&lt;br&gt;&lt;/b&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;A Use Case is the story of how the business or System and the user interact.&lt;/li&gt;&lt;li&gt;Use Cases are formal requirements that clearly define the resultant value.&lt;/li&gt;&lt;li&gt;Use Cases transform &amp;quot;shall&amp;quot; statements into groups that provide observable value and context, organized from a user prospective.&lt;/li&gt; &lt;li&gt;&amp;nbsp;Use Cases describe both functionality and results.&lt;/li&gt;&lt;li&gt;A common mistake is to consider requirements with design specifications.&lt;/li&gt;&lt;li&gt;Diagrams provide a visual reference for the use case.&lt;/li&gt;&lt;li&gt;People are the most important use case element.&lt;/li&gt; &lt;li&gt;Establishing a use case style makes writing and reading them faster and easier.&lt;/li&gt;&lt;li&gt;Use Cases should have a single main flow and multiple alternative flows.&lt;/li&gt;&lt;li&gt;Alternative flows explain deviation from the main flow.&lt;/li&gt; &lt;li&gt;Use Cases are not design documents they are requirement documents.&lt;/li&gt;&lt;li&gt;References define the beginning and the end of an alternative flow.&lt;/li&gt;&lt;li&gt;References indicate what caused an alternative flow to start and what the system does in response.&lt;/li&gt; &lt;li&gt;Readability can suffer if there are &amp;quot;if statements&amp;quot; in a flow, because it usually means multiple requirements.&lt;/li&gt;&lt;li&gt;Selecting a single choice for an actor, and creating alternative flows for other choices, can simplify the main flow.&lt;/li&gt; &lt;li&gt;A poorly written use case has too many create, read, update and delete activities, reducing clarity.&lt;/li&gt;&lt;li&gt;Removing CRUD creates a simpler document.&lt;/li&gt;&lt;li&gt;Sequencing the events in a flow is not always necessary to achieve clarity.&lt;/li&gt; &lt;li&gt;Don&amp;#39;t forget you are writing use cases for the end user. &lt;/li&gt;&lt;li&gt;Agreement on use cases structure and processes is essential to achieving quality and consistency.&lt;/li&gt;&lt;/ul&gt;&lt;font size="1"&gt;&lt;br&gt;Ref: Tips for writing good use cases by James Heumann&lt;/font&gt;&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-80993407897180464?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/80993407897180464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=80993407897180464' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/80993407897180464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/80993407897180464'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/10/use-cases-writing-tips.html' title='Use Cases writing Tips'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-8943067073286418203</id><published>2008-09-16T13:59:00.001+06:00</published><updated>2008-09-16T13:59:34.119+06:00</updated><title type='text'>Rewriting the DotNetNuke Url Rewriter Module - Again</title><content type='html'>&lt;div dir="ltr"&gt;Ref: &lt;a href="http://www.ifinity.com.au/Blog/Technical_Blog/EntryID/24/"&gt;http://www.ifinity.com.au/Blog/Technical_Blog/EntryID/24/&lt;/a&gt; &lt;br&gt;&lt;br&gt;&lt;p&gt;     &lt;span id="dnn_ctr373_MainView_ViewEntry_lblEntry"&gt;&lt;div&gt; &lt;h2&gt;Redoing the DotNetNuke Friendly Url Provider for Human Reading and Search Engines Indexing&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;NOTE&lt;/span&gt;&lt;/font&gt;: Due to popular demand, there is now a &lt;a href="http://www.ifinity.com.au/Products/Support_Forum/"&gt;Support Forum&lt;/a&gt; for support requests on this module, or if you just want the thing to work ASAP, I can provide &lt;a href="http://www.ifinity.com.au/Products/Premium_Support"&gt;one-on-one support or install it for you.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;What I did previously was improve upon Scott McCulloch&amp;#39;s work by working out a way to handle parameters. All well and good, and it worked OK. But it just still didn&amp;#39;t look quite right. What&amp;#39;s more, I wanted to use the rel=&amp;quot;tag&amp;quot; microformat on my tagging module, and I was stuck with the .aspx extension on everything, which the microformat doesn&amp;#39;t recognise.&lt;/p&gt; &lt;p&gt;So after some back and forwards on the Ventrian forum where I posted my update, I went away and had a good think about it. There were two things nagging at me:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;1. The performance would drop off drastically with the number of pages in a site, due to the iterative search for a match.&lt;/li&gt;&lt;li&gt;2. The only way to get truly nice Url&amp;#39;s is to ditch the page extension of .aspx. When you think about it, it doesn&amp;#39;t serve the user at all. It&amp;#39;s really only there to make it easier on the web server. It had to go&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Doing number 1 was easy : just do a dictionary based lookup on the page path, if it&amp;#39;s found, great. If not, 404 coming right up.&lt;/p&gt; &lt;p&gt; It works like this (if you&amp;#39;re not intimately familiar with DNN, you might want to skip to the next part). On the first request, a dictionary of path information is built up. This contains the path (example: mysite/mypage) and the actual DNN request Url (example: default.aspx?tabid=37). The dictionary is stashed away in the Cache.&lt;br&gt;So far so good. The incoming url is deconstructed into segments. Working backwards from the full url (mysite/mypage/mypath/myvalue) the url is tried against the dictionary for a &amp;#39;hit&amp;#39;. If a page entry in the dictionary is found, great, the url is rewritten and processing continues.&lt;br&gt;If the dictionary didn&amp;#39;t contain the page, then the next segment is removed, thus mysite/mypage/mypath/myvalue is trimmed to mysite/mypage/mypath. This trimming process is repeated until there are not segments left. If nothing was found after all that, the page dictionary is rebuilt one more time, just in case it&amp;#39;s a new page, then the process is repeated. If still nothing, then no url rewriting will be done and a 404 will probably occur.&lt;/p&gt; &lt;p&gt;There is obviously a great deal more complexity in it than that, but that&amp;#39;s the basic algorithm.&lt;/p&gt; &lt;p&gt;So onto number 2. Some will look at you with fear in their eyes when you mention removing the .aspx extension from &lt;a href="http://asp.net"&gt;asp.net&lt;/a&gt; pages and declare that &amp;#39;you cannot change the laws of physics&amp;#39;. But in reality there is nothing difficult about removing the .aspx extension from &lt;a href="http://asp.net"&gt;asp.net&lt;/a&gt; pages. There&amp;#39;s really two (easy) ways.&lt;/p&gt; &lt;ul&gt;&lt;li&gt;-&amp;gt; Implement an ISAPI Rewriting DLL. There&amp;#39;s some commercial ones available, and some open-source ones. I assume these work OK, but looked like way too much work for me.&lt;/li&gt;&lt;li&gt;-&amp;gt; Direct all calls to the website through &lt;a href="http://asp.net"&gt;asp.net&lt;/a&gt; by mapping a wildcard (*) to the aspnet_isapi.dll&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Given I was already rewriting Urls, the second of those options was the path of least resistance for me. Now I realise that people using DotNetNuke on a shared host aren&amp;#39;t going to be able to do this, but if you&amp;#39;ve got your own server, it&amp;#39;s not difficult. By mapping all requests to go through &lt;a href="http://asp.net"&gt;asp.net&lt;/a&gt;, all requests for items on the website (or virtual directory) end up going through the DNN Url Rewriter. Eek - better make sure they work then.&lt;/p&gt; &lt;p&gt;To fix this, I implemented a couple of regex filters to be placed in the web.config. These restrict what items will be passed along to IIS unfettered and what will be rewritten by the UrlRewrite code. And that was about it - because the way the dictionary lookup works, the .aspx is redundant anyway. Because all entries in the dictionary are without .aspx, it&amp;#39;s not needed to find them again - only the relative path.&lt;/p&gt; &lt;p&gt;Once the messy .aspx extensions are eradicated, getting nicer Url&amp;#39;s is easy-peasy. Instead of doing by front-to-back flipping of parameters around, now I just put them out in-line, as they should. So, from the example given in the first posting on this topic, the results now are:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Original,standard, DotNetNuke friendly Url: /MyPage/TabId/38/Key1/Value1/Key2/Value/default.aspx&lt;/li&gt;&lt;li&gt;My rewritten Url (first version): /MyPage/Value1/Key2/Value2/Key1.aspx&lt;/li&gt; &lt;li&gt;My rewritten Url (no .aspx version): /MyPage/Key1/Value1/Key2/Value2&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Of course, there are still times when the first-parm-last scenario might work well, so I&amp;#39;ve left it in as a configurable option. This is particularly the case if you can&amp;#39;t remove the .aspx extensions (shared hosting, for example)&lt;/p&gt; &lt;p&gt;Here&amp;#39;s the original examples from the first post redone:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;u&gt;Directory Module&lt;/u&gt; &lt;ul&gt;&lt;li&gt;Original: &lt;a href="http://www.auctionlink.com.au/Auctioneers/TabId/54/Auctioneer/Grays_NSW/default.aspx"&gt;http://www.auctionlink.com.au/Auctioneers/TabId/54/Auctioneer/Grays_NSW/default.aspx&lt;/a&gt;&lt;/li&gt; &lt;li&gt;First version: &lt;a href="http://www.auctionlink.com.au/Auctioneers/Grays_NSW/Auctioneer.aspx"&gt;http://www.auctionlink.com.au/Auctioneers/Grays_NSW/Auctioneer.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;New Version: &lt;a href="http://www.auctionlink.com.au/Auctioneers/Auctioneer/Grays_NSW/"&gt;http://www.auctionlink.com.au/Auctioneers/Auctioneer/Grays_NSW/&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt;&lt;li&gt;&lt;u&gt;Tagging Module&lt;/u&gt; &lt;ul&gt;&lt;li&gt;Original: &lt;a href="http://www.auctionlink.com.au/TagList/TabId/56/Tag/Auctioneers/default.aspx"&gt;http://www.auctionlink.com.au/TagList/TabId/56/Tag/Auctioneers/default.aspx&lt;/a&gt;&lt;/li&gt; &lt;li&gt;First Version: &lt;a href="http://www.auctionlink.com.au/TagList/Auctioneers/Tag.aspx"&gt;http://www.auctionlink.com.au/TagList/Auctioneers/Tag.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;New Version: &lt;a href="http://www.auctionlink.com.au/TagList/Tag/Auctioneers"&gt;http://www.auctionlink.com.au/TagList/Tag/Auctioneers/&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt;&lt;li&gt;&lt;u&gt;Tagging Module with 2 parameters (tag name and page number)&lt;/u&gt; &lt;ul&gt;&lt;li&gt;Original: &lt;a href="http://www.auctionlink.com.au/TagList/TabId/56/Tag/Auctioneers/pg/2/default.aspx"&gt;http://www.auctionlink.com.au/TagList/TabId/56/Tag/Auctioneers/pg/2/default.aspx&lt;/a&gt;&lt;/li&gt; &lt;li&gt;First Version: &lt;a href="http://www.auctionlink.com.au/TagList/Auctioneers/pg/2/Tag.aspx"&gt;http://www.auctionlink.com.au/TagList/Auctioneers/pg/2/Tag.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;New Version: &lt;a href="http://www.auctionlink.com.au/TagList/Tag/Auctioneers/pg/2/"&gt;http://www.auctionlink.com.au/TagList/Tag/Auctioneers/pg/2/&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;What about the 301 Redirects?&lt;/h2&gt; &lt;p&gt;The 301 redirect code in the original version was an important step forwards for my SEO DotNetNuke efforts. DNN has a habit of outputting a variety of Url&amp;#39;s for the same bit of content, so it&amp;#39;s important to stay on top of this by both generating a single Url per bit of content, but also to let Google know you&amp;#39;ve been on the case of hunting down every last default.aspx?tabid=37 and home/tabid/37/default.aspx reference.&lt;/p&gt; &lt;p&gt;So the new code maintains the previous features, and adds a couple more - when a request comes in that doesn&amp;#39;t end in a &amp;#39;/&amp;#39;, it puts one on. If a request comes in for a page with .aspx, and you&amp;#39;ve turned .aspx off, then it returns a 301 status and gives the new, cleaner url. As well as this, if you&amp;#39;ve got a page you&amp;#39;ve deleted from your website, or it was only visible for a period of time, then requests for the no-longer-valid page will redirect to the home page of your portal with a 301.&lt;/p&gt; &lt;h2&gt;Full feature list of this Url Rewriter / Friendly Url Provider&lt;/h2&gt; &lt;p&gt;Here&amp;#39;s a list of all the things that this version can do:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Url&amp;#39;s are generated as friendly Urls by all code which uses the standard NavigateUrl() call in DotNetNuke.&lt;/li&gt; &lt;li&gt;Choice of page extension - .aspx or any other extension (such as .page)&lt;/li&gt;&lt;li&gt;Choice of using page extensions - options are &amp;quot;always&amp;quot;, &amp;quot;never&amp;quot;, &amp;quot;pageOnly&amp;quot;. Always and never are self-explanatory, pageonly means only use an extension when the Url is for a page that contains no query parameters.&lt;/li&gt;&lt;li&gt;301 redirects for &amp;#39;unfriendly&amp;#39; page requests. This can be on or off.&lt;/li&gt;&lt;li&gt;301 redirects to home page for deleted and expired pages&lt;/li&gt; &lt;li&gt;A regex filter can be implemented to restrict 301 redirects for matching Urls&lt;/li&gt;&lt;li&gt;Individual pages can be restricted from 301 redirects by placing in a delimited list&lt;/li&gt;&lt;li&gt;Choice of two ways of handling parameters/query strings - ordered, in which the values are shown as consecutive levels in a path (key1/value1/key2/value2) and &amp;quot;firstparmlast&amp;quot; in which the first key value is placed last (value1/key2/value2/key2).&lt;/li&gt;&lt;li&gt;Choice of detecting duplicate portal alias/page path combinations. It is possible to have portal1/test as a page, and a portal which has portal1/test as an alias, thus duplicating the same path on a single DNN install.&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;How to install the DNN Friendly Url Provider&lt;/h2&gt; &lt;p&gt;&lt;u&gt;Step 1:&lt;/u&gt; Download the code from the &lt;a href="http://www.ifinity.com.au/Products/Free_Downloads/"&gt;Free Downloads&lt;/a&gt; page.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Step 2:&lt;/u&gt; Backup your existing DotNetNuke.HttpModules.UrlRewrite.dll from your website/bin directory, and copy the new version in to the /bin directory.&lt;/p&gt; &lt;p&gt;&lt;u&gt;Step 3:&lt;/u&gt; Backup your existing web.config, and then replace the existing &amp;#39;DNNFriendlyUrl&amp;#39; provider section with this one:&lt;/p&gt; &lt;div style="padding-left: 10px;"&gt; &lt;div&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;font color="#0000ff" size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;add&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;DNNFriendlyUrl&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;type&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;DotNetNuke.Services.Url.FriendlyUrl.DNNFriendlyUrlProvider, DotNetNuke.HttpModules.UrlRewrite&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;includePageName&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;regexMatch&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;[^\+a-zA-Z0-9 _-]&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;urlFormat&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;HumanFriendly&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;redirectUnfriendly&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;doNotRewriteRegex&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;(\.axd)|(/DesktopModules/)&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;doNotRedirect&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;DirectorySearchResults;&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;doNotRedirectRegex&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;[.]*(/logoff.aspx)&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;pageExtensionUsage&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;never&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;parameterHandling&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;ordered&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;ignoreFileTypesRegex&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;(\.gif)|(\.css)|(\.js)|(\.jpg)|(\.html)|(\.htm)&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;checkForDupUrls&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font color="#000000" size="2"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;/&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;  &lt;/div&gt; &lt;p&gt;&lt;u&gt;Step 4:&lt;/u&gt; Change any options to suit how you&amp;#39;d like your DNN installation to work. The full list is below.&lt;/p&gt; &lt;p&gt;&lt;u&gt;Step 5:&lt;/u&gt; Try it out!&lt;/p&gt; &lt;p&gt;If you haven&amp;#39;t already done so, you might want to take a look at the &lt;a href="http://www.ifinity.com.au/Blog/TechnicalBlog/tabid/60/EntryID/12/Default.aspx"&gt;DotNetNuke Google Sitemap Generator&lt;/a&gt; available in the &lt;a href="http://www.ifinity.com.au/Whatwedo/FreeDownloads/tabid/388/Default.aspx"&gt;free downloads&lt;/a&gt; section&lt;/p&gt;  &lt;h2&gt;Changing Config Entries for Different Options&lt;/h2&gt; &lt;table border="1" cellpadding="3" cellspacing="1" width="497"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="245"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtensionUsage&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="never"&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; font-family: &amp;#39;Courier New&amp;#39;;"&gt;*&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;/td&gt; &lt;td valign="top"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtensionUsage&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="always"&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 8pt; font-family: &amp;#39;Courier New&amp;#39;;"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="height: 8.25pt;"&gt; &lt;td valign="top" width="245"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;/Enquiries/&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt; &lt;span style="font-size: 10pt; font-family: Arial;"&gt;/Enquiries.aspx&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr style="height: 14.25pt;"&gt; &lt;td valign="top" width="245"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtensionUsage&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="never"&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 8pt; font-family: &amp;#39;Courier New&amp;#39;;"&gt;*&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;parameterHandling&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="ordered"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;/td&gt; &lt;td valign="top"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtensionUsage&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="always"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;parameterHandling&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="ordered"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="height: 21pt;"&gt; &lt;td valign="top" width="245"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;/TagList/Tag/Valuers/&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt; &lt;span style="font-size: 10pt; font-family: Arial;"&gt;/TagList/Tag/Valuers.aspx&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr style="height: 21pt;"&gt; &lt;td valign="top" width="245"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtensionUsage&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="never"&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 8pt; font-family: &amp;#39;Courier New&amp;#39;;"&gt;*&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;parameterHandling&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="firstparmlast"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;/td&gt; &lt;td valign="top"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtensionUsage&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="always"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;parameterHandling&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="firstparmlast"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="height: 21pt;"&gt; &lt;td valign="top" width="245"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;/TagList/Valuers/Tag/&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt; &lt;span style="font-size: 10pt; font-family: Arial;"&gt;/TagList/Valuers/Tag.aspx&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr style="height: 14.25pt;"&gt; &lt;td valign="top" width="245"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtensionUsage&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="pageonly"&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 8pt; font-family: &amp;#39;Courier New&amp;#39;;"&gt;* &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;/td&gt; &lt;td valign="top"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtensionUsage&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="always"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtension&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;=".page"&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 8pt; font-family: &amp;#39;Courier New&amp;#39;;"&gt;**&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="height: 8.25pt;"&gt; &lt;td valign="top" width="245"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;/Enquiries.aspx&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt; &lt;span style="font-size: 10pt; font-family: Arial;"&gt;/Enquiries.page&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr style="height: 14.25pt;"&gt; &lt;td valign="top" width="245"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtensionUsage&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="pageonly"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;parameterHandling&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="ordered"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;/td&gt; &lt;td valign="top"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtensionUsage&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="always"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtension&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;=".page"&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 8pt; font-family: &amp;#39;Courier New&amp;#39;;"&gt;**&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;parameterHandling&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="ordered"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="height: 21pt;"&gt; &lt;td valign="top" width="245"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;/TagList/Tag/Valuers/&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt; &lt;span style="font-size: 10pt; font-family: Arial;"&gt;/TagList/Tag/Valuers.page&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr style="height: 21pt;"&gt; &lt;td valign="top" width="245"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtensionUsage&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="pageonly"&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 8pt; font-family: &amp;#39;Courier New&amp;#39;;"&gt;*&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;parameterHandling&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="firstparmlast"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;/td&gt; &lt;td valign="top"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtensionUsage&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="always"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;pageExtension&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;=".page"&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 8pt; font-family: &amp;#39;Courier New&amp;#39;;"&gt;**&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: red; font-family: &amp;#39;Courier New&amp;#39;;"&gt;parameterHandling&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;#39;Courier New&amp;#39;;"&gt;="firstparmlast"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="height: 21pt;"&gt; &lt;td valign="top" width="245"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;/TagList/Valuers/Tag/&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top"&gt; &lt;p style="margin: 0cm 0cm 0pt;"&gt; &lt;span style="font-size: 10pt; font-family: Arial;"&gt;/TagList/Valuers/Tag.page&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt;&lt;br&gt;&lt;br&gt;&lt;h3&gt;Complete list of web.config options&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;&lt;strong&gt;urlFormat&lt;/strong&gt; (HumanFriendly,omitted) - &amp;#39;humanFriendly&amp;#39; when using tabid less paths. If omitted, will use standard DNN-style friendly Urls&lt;/li&gt; &lt;li&gt;&lt;strong&gt;doNotRewriteRegex&lt;/strong&gt; - regex string for excluding incoming requests. If the incoming request matches the regex, no rewriting will be attempted. This is used to handle exceptions, such as direct calls to pages/controls in the DesktopModules path.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;checkForDupURls&lt;/strong&gt; (true/false) - true means an exception will be logged if duplicate urls are found while building the tab dictionary. Duplicate url&amp;#39;s are urls where the combination of portalAlias/tabpath from two different portals match. Preference is always given to the &amp;#39;first&amp;#39; portal / tab path combo, so the second and suqsequent combos will never resolve properly.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;redirectUnfriendly&lt;/strong&gt; (true/false) - whether to issue 301 redirect status codes if an incoming url does not match the friendly url for that page&lt;/li&gt; &lt;li&gt;&lt;strong&gt;doNotRedirect&lt;/strong&gt; - semicolon delimited list of tab paths where a 301 redirect should never be issued. Use when a particular page should use ?key=val type parameters, or unwanted results are occuring. This is only used when &lt;strong&gt;redirectUnfriendly = true&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;doNotRedirectRegex&lt;/strong&gt; - a regex expression which, when evaluated against the incoming url, will not redirect if the result is a match. In the example, the /logoff.aspx page will never 301 redirect. This is only used when &lt;strong&gt;redirectUnfriendly = true &lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;parameterHandling&lt;/strong&gt; (ordered, firstlast) - ordered means key/value pairs are kept in order, and placed after the tab path. ie mypage/mykey1/myvalue1/mykey2/myvalue2. firstlast means take the key of the first parameter and place it last, at the end of the string. mypage/myvalue1/mykey2/myvalue2/mykey1. Default : firstlast&lt;/li&gt;&lt;li&gt;&lt;strong&gt;pageExtensionUsage&lt;/strong&gt; (never, pageonly or always) - three options on whether to use page extensions (ie .aspx) for the pages. never = don&amp;#39;t use page extensions, pageonly = only use page extensions when the page path does not include parameter key/value pairs (ie mysite/mypage.aspx but not mysite/mypage/mykey/myvalue), always = .aspx is appended to all urls. Default : alwaysUse. If using pageonly or never, the iis setup must have wildcard mapping to the aspnet_isapi.dll (instructions below)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;ignoreFileTypeRegex&lt;/strong&gt; (Regex string) - when mapping wildcard requests to aspnet_isapi.dll, the &lt;a href="http://asp.net"&gt;asp.net&lt;/a&gt; url rewriting function will be called for all types of iis resources on the page. This means unnecessary file handling for jpeg, gif, css,axd and other file types. By entering a regex string, any match found will bypass the url rewriting code and be passed back to iis.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;pageExtension&lt;/strong&gt; - allows the use of a page extension other than .aspx if required. (ie .page, .content - whatever)&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Changing IIS Settings for either a custom page extension, or no page extension&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;Warning: This may destabilise your website. Always check this on a test version first, and understand what you are doing!&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;These instructions will vary between IIS 5.0, IIS 6.0 and the Workstation and Server versions of 2000/XP/2003/Vista&lt;/p&gt;  &lt;h3&gt;Changing IIS Settings to map all requests through the aspnet isapi dll&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;open property page for website / virtual directory.&lt;/li&gt;&lt;li&gt;click the &amp;#39;configuration&amp;#39; button, select the &amp;#39;mappings&amp;#39; tab&lt;/li&gt; &lt;li&gt;click on the &amp;#39;add&amp;#39; button&lt;/li&gt;&lt;li&gt;Enter the details: &lt;ul&gt;&lt;li&gt;Executable = \framework\\aspnet_isapi.dll&lt;/li&gt;&lt;li&gt;For no page extension -&amp;gt; Extension = .*&lt;/li&gt;&lt;li&gt;For custom page extension -&amp;gt; Extension = .{your value}&lt;/li&gt; &lt;li&gt;Verbs = GET,POST,HEAD,DEBUG&lt;/li&gt;&lt;li&gt;Script Engine :checked&lt;/li&gt;&lt;li&gt;Check that file exists : unchecked&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;Click OK, OK, OK to close and apply changes.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Then thoroughly test all website functions. And you&amp;#39;re done!&lt;/p&gt;  &lt;/div&gt; &lt;h2&gt;Update (22 Nov 2007)&lt;/h2&gt; &lt;p&gt;Due to the problems with the 4.7 release and namespace collision with the config part of the module, I&amp;#39;ve released a new version which uses it&amp;#39;s own namespace and should solve the problems. However, this requires new web.config entries. The changes are available in the free downloads section.&lt;/p&gt; &lt;p&gt;This new version requires different modifications to the web.config from those shown in this blog post. The options are the same, but the namespace has changed. Please see the example.web.config file included in the downloads to see what changes are required for the web.config&lt;/p&gt; &lt;p&gt;There are also three new features in this new version, which are set using the following configuration attributes:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;redirectWrongCase - allows 301 redirection of mixed case requests to lower case requests&lt;/li&gt; &lt;li&gt;forceLowerCase - when true, forces all generated Urls to be in all lower case&lt;/li&gt;&lt;li&gt;redirectToSubDomain - when implemented, all requests will be 301 redirected to the specified subdomain, regardless of what subdomain they were requested on. Can be left as an empty string to remove the subdomain completely.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Again, see the example.web.config on the different options for these features&lt;/p&gt; &lt;p&gt;Any problems please report them using the comments section below (I might have to stretch to forums one day!)&lt;/p&gt;  &lt;h2&gt;Update (10 Jan 2008)&lt;/h2&gt; &lt;p&gt;In response to the many requests to include a way of substituting spaces with a &amp;#39;-&amp;#39; or &amp;#39;_&amp;#39;, I have included a &amp;#39;replaceSpaceWith&amp;#39; option. This will replace any spaces in a tab path with the supplied character. It will also issue a 301 redirect for any request to the &amp;#39;space removed&amp;#39; version. This means that existing pages found in search engines will redirect to the new version.&lt;/p&gt; &lt;p&gt;I&amp;#39;ve also fixed (finally) the problems with getting an exception on the Host Settings page. Basically, in versions of DotNetNuke prior to 4.5, the Friendly Url Provider shared a namespace with internal classes. I&amp;#39;ve explictly implemented a cast so that my provider will be able to interact with the host settings page. However, for DNN versions 4.6 and above, the FriendlyUrl provider was moved into the single DotNetNuke.HttpModules assembly. This solved the problem, so the later version of my Friendly Url provider just doesn&amp;#39;t include the section for reading the FriendlyUrl rules.&lt;/p&gt; &lt;p&gt;The new files can be found on the Free Downloads page. You must install the correct version for your DNN install. If you are running 4.0 - 4.5, then you want the 4.5 version. If you are running 4.6 or later, then you want the 4.6 version. Trying to run the later version with the earlier DNN installs will just cause errors - there is no benefit in running the 4.6 code - it&amp;#39;s just a compatibility change, both version are built from the same base source.&lt;/p&gt;&lt;/span&gt;   &lt;/p&gt;   &lt;p&gt;     &lt;span id="dnn_ctr373_MainView_ViewEntry_lblCopyright" class="blog_copyright"&gt;Copyright Bruce Chapman 2007&lt;/span&gt;   &lt;/p&gt;&lt;br&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-8943067073286418203?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/8943067073286418203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=8943067073286418203' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/8943067073286418203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/8943067073286418203'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/09/rewriting-dotnetnuke-url-rewriter_16.html' title='Rewriting the DotNetNuke Url Rewriter Module - Again'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-4698844307638798455</id><published>2008-09-16T13:58:00.001+06:00</published><updated>2008-09-16T13:58:33.580+06:00</updated><title type='text'>Rewriting the DotNetNuke Url Rewriter Module</title><content type='html'>&lt;div dir="ltr"&gt;Ref: &lt;a href="http://www.ifinity.com.au/Blog/Technical_Blog/EntryID/19/"&gt;http://www.ifinity.com.au/Blog/Technical_Blog/EntryID/19/&lt;/a&gt;&lt;br&gt;&lt;p&gt;     &lt;span id="dnn_ctr373_MainView_ViewEntry_lblEntry"&gt; &lt;div&gt; &lt;p&gt;As part of my ongoing interest in making DotNetNuke websites more person and search engine friendly, I started hunting around in the space again to see what was available. While the latest DotNetNuke releases have good ability to enter site rewrite rules (such as an automatic home.aspx redirection), the crucial problem for me is that the site doesn&amp;#39;t generate simple Url&amp;#39;s (instead it still outputs pagename/tabid/nn/default.aspx)&lt;/p&gt; &lt;p&gt;I had previously looked at the Inventua Http module, and while it is a good product, it didn&amp;#39;t quite suit my needs. I guess it came down to not being able to get the source code either. It also didn&amp;#39;t work with the Catalook module, which I have done some work with and still support on some sites.&lt;/p&gt; &lt;p&gt;Further searching brought me across Scott McCulloch&amp;#39;s &amp;#39;Friendly Urls&amp;#39; work on his site at &lt;a href="http://www.ventrian.com/Resources/Projects/FriendlyUrls.aspx"&gt;http://www.ventrian.com/Resources/Projects/FriendlyUrls.aspx&lt;/a&gt;. (it&amp;#39;s even a friendly url!) This showed a bit more promise, because he was automatically rewriting the Url&amp;#39;s based on the path of the page. But Scott left &amp;#39;Human Readable Urls for Pages With Multiple Parameters&amp;#39; listed under &amp;#39;items for discussion&amp;#39;.&lt;/p&gt; &lt;h2&gt;How the Url Rewriting in DotNetNuke works&lt;/h2&gt; &lt;p&gt;Without going into the explicitly technical details, here&amp;#39;s a quick primer. There are two facets to Url Rewriting in DotNetNuke:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Generating Friendly Urls for Hyperlinks, menu items and other outputs.&lt;/li&gt;&lt;li&gt;Interpreting those Friendly Urls when requested, and working out which page to show.&lt;/li&gt;&lt;/ul&gt; &lt;strong&gt;Generating Friendly Urls for Hyperlinks&lt;/strong&gt; &lt;p&gt;This is really the easy part, because theoretically you can generate the friendliest Url&amp;#39;s in the world to show - it&amp;#39;s only when they have to be re-interpreted that it becomes a problem! Having said that, this is how it works:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Some code, somewhere calls DotNetNuke.Common.Globals.NavigateUrl(). This call requires the desired Tab (page), Portal, Url parameters if any. There&amp;#39;s a few different versions of it, but they all distill down to the same call.&lt;/li&gt;&lt;li&gt;NavigateUrl determines the Http Alias of your Portal (ie &lt;a href="http://www.ifinity.com.au"&gt;www.ifinity.com.au&lt;/a&gt;), determines the TabId, and adds it to any query parameters. This results in the familiar Url of &lt;a href="http://www.ifinity.com.au/default.aspx?tabid=38"&gt;www.ifinity.com.au/default.aspx?tabid=38&lt;/a&gt;&lt;/li&gt;&lt;li&gt;NavigateUrl then checks if the Host setting of &amp;#39;UseFriendlyUrls&amp;#39; is set to &amp;#39;true&amp;#39;. And if so, calls the DNNFriendlyUrl provider as specified in the web.config. By default this is &amp;#39;DotNetNuke.HttpModules.UrlRewrite.dll&amp;#39;, which is part of the base code.&lt;/li&gt;&lt;li&gt;The DNNFriendlyUrl provider must have an implementation of a function called &amp;#39;FriendlyUrl&amp;#39;, which reformats the generated Url into a &amp;#39;friendly&amp;#39; format. In the case of the standard provider, the url of &lt;a href="http://www.ifinity.com.au/default.aspx?tabid=38"&gt;www.ifinity.com.au/default.aspx?tabid=38&lt;/a&gt; would come back as &lt;a href="http://www.ifinity.com.au/Home/Tabid/38/default.aspx"&gt;www.ifinity.com.au/Home/Tabid/38/default.aspx&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The &amp;#39;standard&amp;#39; FriendlyUrl provider does this by performing a simple reshuffling of the various parts of the querystring to achieve the necessary output. It&amp;#39;s fast and works pretty well.&lt;/p&gt; &lt;strong&gt;Interpreting Friendly Urls&lt;/strong&gt; &lt;p&gt;The trickier part is determining what /home/tabid/38/default.aspx means when someone clicks on a hyperlink with this address. To do this, DotNetNuke uses the &amp;#39;UrlRewrite&amp;#39; HttpModule. Now, in the standard DotNetNuke build, the UrlRewrite module and the FriendlyUrl provider are in the same assembly for ease of packaging and coding, but they don&amp;#39;t necessarily have to be like that. When a Http Request comes into the DotNetNuke code (ie, you click on a hyperlink to load a new page) the DNN base throws the incoming Url to the UrlRewrite module, with an implicit request &amp;#39;turn this into something I can understand, will you?&amp;#39;&lt;/p&gt; &lt;p&gt;You should remember that the DNN base is just a page called default.aspx, and it only knows how to interpret a classic style query string - ie ?tabid=38&amp;amp;key1=value1&amp;amp;key2=value2 etc.&lt;/p&gt; &lt;p&gt;This is the sequence of events:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;The incoming System.Web.HttpContext.Current.Request (Request for short) is directed to the UrlRewrite HttpModule, in the &amp;#39;OnBeginRequest&amp;#39; event.&lt;/li&gt;&lt;li&gt;The request is inspected for certain exception cases, and then put through a Regex expression to determine the tabid and (sometimes) the portalId&lt;/li&gt;&lt;li&gt;Assuming the TabId is found in the incoming Url, the Request.Url is rewritten in the style expected, putting the TabId into the output parameters.&lt;/li&gt;&lt;li&gt;The request passes back to the DotNetNuke framework, and the requested page is loaded.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;All this happens for each and every request made to a DNN portal. So performance and scalability is paramount in any changes made in this area. If you are so inclined, I suggest stepping through the code one day just to see how often it gets called, and how much work goes on in the background to provide friendly Url&amp;#39;s. It&amp;#39;s when you do this you start to understand some of the issues surrounding a fully-dynamic website and fully-dynamic Url&amp;#39;s.&lt;/p&gt; &lt;h2&gt;How I set out to Improve it for my own purposes&lt;/h2&gt; &lt;p&gt;Please note : the changes I am discussing here were changes I made to suit my own needs, and those needs are probably not aligned with many people in the DotNetNuke user group. So none of this is a criticism of the base code, or other people&amp;#39;s work. It&amp;#39;s just a discussion on getting it to work the way I wanted.&lt;/p&gt; &lt;p&gt;My requirements were the same as what Scott outlined in his article: better Urls for human and search engine purposes. However, most work I do with DNN modules tends to involve a lot of parameters in the query string, and so his open problem of what to do with multiple querystring parameters was the same as my own.&lt;/p&gt; &lt;p&gt;Specifically, I am developing two new modules: a Tagging module for tagging DNN content, and a Directory Module, for storage of Organization Directories. One of the principal aims of these two modules was nice-looking Urls with high keyword ratios in the Url. But I soon struck the same problem - what do you do with multiple parameters.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;My Answer&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;My solution to this question was to re-arrange the order of the parameters, and use the &lt;em&gt;key name&lt;/em&gt; of the first parameter as the &lt;em&gt;page name&lt;/em&gt; in the Url. Confused? I bet!  Here&amp;#39;s what I mean:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Original,standard, DotNetNuke friendly Url: /MyPage/TabId/38/Key1/Value1/Key2/Value/default.aspx&lt;/li&gt;&lt;li&gt;My rewritten Url: /MyPage/Value1/Key2/Value2/Key1.aspx&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;While that may look a little strange and have you scratching your head, I can assure there&amp;#39;s method to my madness. The first site I have implemented this on is a &lt;a href="http://www.auctionlink.com.au/"&gt;List of Auctioneers in Australia&lt;/a&gt;. It has the implementation of my new Tagging module and my new Directory module. Here are two Url&amp;#39;s in that site, in &amp;#39;original&amp;#39; and rewritten form:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;u&gt;Directory Module&lt;/u&gt;     &lt;ul&gt;&lt;li&gt;Original: &lt;a href="http://www.auctionlink.com.au/Auctioneers/TabId/54/Auctioneer/Grays_NSW/default.aspx"&gt;http://www.auctionlink.com.au/Auctioneers/TabId/54/Auctioneer/Grays_NSW/default.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Rewritten: &lt;a href="http://www.auctionlink.com.au/Auctioneers/Grays_NSW/Auctioneer.aspx"&gt;http://www.auctionlink.com.au/Auctioneers/Grays_NSW/Auctioneer.aspx&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;     &lt;/li&gt;&lt;li&gt;&lt;u&gt;Tagging Module&lt;/u&gt;     &lt;ul&gt;&lt;li&gt;Original: &lt;a href="http://www.auctionlink.com.au/TagList/TabId/56/Tag/Auctioneers/default.aspx"&gt;http://www.auctionlink.com.au/TagList/TabId/56/Tag/Auctioneers/default.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Rewritten: &lt;a href="http://www.auctionlink.com.au/TagList/Auctioneers/Tag.aspx"&gt;http://www.auctionlink.com.au/TagList/Auctioneers/Tag.aspx&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;     &lt;/li&gt;&lt;li&gt;&lt;u&gt;Tagging Module with 2 parameters (tag name and page number)&lt;/u&gt;     &lt;ul&gt;&lt;li&gt;Original: &lt;a href="http://www.auctionlink.com.au/TagList/TabId/56/Tag/Auctioneers/pg/2/default.aspx"&gt;http://www.auctionlink.com.au/TagList/TabId/56/Tag/Auctioneers/pg/2/default.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Rewritten: &lt;a href="http://www.auctionlink.com.au/TagList/Auctioneers/pg/2/Tag.aspx"&gt;http://www.auctionlink.com.au/TagList/Auctioneers/pg/2/Tag.aspx&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;     &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;em&gt;Note: the rewriting has nothing to do with the module code, it is all in the HttpModule.URLRewrite Assembly.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;I consider this a &amp;#39;first draft&amp;#39; because I&amp;#39;m still not totally happy with it. I actually want to implement the Tag miniformat, and to do that I need to have the tag url looking like this : /TagList/Tag/Auctioneer - with no parameters on the end. It&amp;#39;s certainly possible given the code I&amp;#39;ve written, but I&amp;#39;ll leave it for a bit further down the track.&lt;/p&gt; &lt;h2&gt;What about the old code?&lt;/h2&gt; &lt;p&gt;That all works great for a new site such as the &lt;a href="http://www.auctionlink.com.au"&gt;www.auctionlink.com.au&lt;/a&gt; site, as, in combination with my DotNetNuke Google Sitemap Provider, the googlebot has hoovered up all the friendly Url&amp;#39;s and integrated them into the index nicely. So if you search for &lt;a href="http://AuctionLink.com.au"&gt;AuctionLink.com.au&lt;/a&gt; on Google, you should see the friendly Urls rather than the tabid/nn/default.aspx-style Urls.&lt;/p&gt; &lt;p&gt;But what about sites that have been in the index for a while? Indeed, this is the problem with the &lt;a href="http://ifinity.com.au"&gt;ifinity.com.au&lt;/a&gt; site - it is in the Google index with the standard, friendly Urls. I&amp;#39;d like to implement my version of the UrlRewrite module for this site as well, and get some friendlier Url&amp;#39;s happening. But Google and others have the old Url&amp;#39;s already in the index, and, because the DNN framework will still respond to the older style Url&amp;#39;s, I could even get search-engine penalised for duplicate content - which is when the search engines deem you to have two distinct Url&amp;#39;s pointing to the same content. Even if that&amp;#39;s not a problem, I&amp;#39;d still like to have the best Url&amp;#39;s showing in the index.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Enter the 301 Redirect&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;After reading Matt Cutt&amp;#39;s blog on Google about 301 redirects, it got me thinking- I could issue a 301 redirect for every request that came into the site for an older style Url. That way search engines which take notice of the Http standards should eventually update their indexes to include the new content.&lt;/p&gt; &lt;p&gt;If you don&amp;#39;t know what a 301 redirect is, it&amp;#39;s a Http status code of &amp;#39;301 - Moved Permanently&amp;#39;. It&amp;#39;s basically saying, yes I have the content for you, but now it&amp;#39;s over here: please update your references. In some agents (certain browsers) it will actually call the new Url instead, where some agents will just ignore it and show the content if it&amp;#39;s available. Google have stated (via Matt Cutt&amp;#39;s blog) that they do read and obey 301, and you can use it to advice the Googlebot of new locations.&lt;/p&gt; &lt;h2&gt;Implementing 301 Redirects in UrlRewrite&lt;/h2&gt; &lt;p&gt;The code does this by detecting if a Url came into the site as an old style friendly Url - ie tabid/38/default.aspx. Then it works out what the &amp;#39;friendly&amp;#39; url should be : home.aspx. If the incoming Url and the Friendly Url are different, then a 301 status is returned and the new friendly Url is given as the new location. There are exceptions to this, and there is a switch in the web.config to disable it once there are few &amp;#39;old style&amp;#39; url&amp;#39;s coming into the site (presumably once the search indexes are updated)&lt;/p&gt; &lt;p&gt;There is also a section in the web.config for excluding certain pages from rewrites. For instance, in the auctionLINK site, I have implemented a search function that deliberately uses a non-friendly query string. This page is excluded from 301 redirects because I don&amp;#39;t want the query string to be friendly.&lt;/p&gt; &lt;p&gt;Here is the result, as shown by Fiddler, the free http monitoring tool distributed by Microsoft:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="text-decoration: underline;"&gt;Original Request (raw):&lt;br&gt;     &lt;/span&gt;GET /Home/tabid/37/Default.aspx HTTP/1.1&lt;br&gt;     Accept: */*&lt;br&gt;     Accept-Language: en-au&lt;br&gt;     Accept-Encoding: gzip, deflate&lt;br&gt;     User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; InfoPath.1)&lt;br&gt;     Host: &lt;a href="http://www.auctionlink.com.au"&gt;www.auctionlink.com.au&lt;/a&gt;&lt;br&gt;     Proxy-Connection: Keep-Alive&lt;br&gt;     Pragma: no-cache&lt;/li&gt;&lt;li&gt;&lt;span style="text-decoration: underline;"&gt;Response from Website (raw):&lt;/span&gt;&lt;br&gt;     HTTP/1.1 301 Moved Permanently&lt;br&gt;     Date: Thu, 30 Aug 2007 07:26:32 GMT&lt;br&gt;     Server: Microsoft-IIS/6.0&lt;br&gt;     X-AspNet-Version: 2.0.50727&lt;br&gt;     Location: &lt;a href="http://www.auctionlink.com.au/Home.aspx"&gt;http://www.auctionlink.com.au/Home.aspx&lt;/a&gt;&lt;br&gt;     Cache-Control: private&lt;br&gt;     Content-Length: 0&lt;br&gt;     Connection: close&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;Installing and Using the Code&lt;/h2&gt; &lt;p&gt;I have provided the source code for the HttpModule.UrlRewrite version in the &lt;a href="http://www.ifinity.com.au/Blog/Technical_Blog/EntryID/19/"&gt;Free Downloads&lt;/a&gt; page of this site.  Steps to use it are:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Download the code from the Free Downloads Page.&lt;/li&gt;&lt;li&gt;Copy the &amp;#39;DotNetNuke.HttpModule.UrlRewrite&amp;#39; binary into your website&amp;#39;s \bin directory (it won&amp;#39;t do anything until you change the web.config)&lt;/li&gt;&lt;li&gt;Backup your web.config, then modify the &amp;#39;DNNFriendlyUrl&amp;#39; provider section so that it looks like the following:&lt;br&gt;     &lt;/li&gt;&lt;li&gt;If you would prefer not to use the 301 redirects, set redirectUnfriendly=&amp;quot;false&amp;quot;&lt;/li&gt;&lt;li&gt;If you would like to use the 301 redirects, but not for a certain page/pages, put the &amp;#39;TabPath&amp;#39; value for those pages in a semi-colon delimited list - ie home;enquires;products/myproduct;&amp;nbsp; (you should only use one forward slash, not two like the way it is stored in the database)&amp;nbsp; Note in the example above, I have excluded &amp;#39;SearchResults&amp;#39; from redirects.&lt;/li&gt;&lt;li&gt;If you are using Redirects, it&amp;#39;s a good idea to use a tool like Fiddler to check that your site is working as expected.&amp;nbsp; Check every page, because unfortunately it is possible for the redirect code to get stuck in a terminal loop (if anyone has an idea how to detect/stop this, I&amp;#39;m all ears)&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;The Disclaimer&lt;/h2&gt; &lt;p&gt;This code is really in a BETA state.&amp;nbsp; It is pretty fresh off the code production line and hasn&amp;#39;t been totally tested in anger yet.&amp;nbsp; If you do install it, please promise me that you will test it in a non-critical environment first, and that you will check &lt;em&gt;every&lt;/em&gt; Url on your site to make sure that it works as you expect.&amp;nbsp; I&amp;#39;m still developing it myself and may post updates if I think they are worthwhile.&lt;/p&gt; &lt;p&gt;This code is a branch of Scott McCulloch&amp;#39;s work, so full credit to him for getting me started in the right direction.&amp;nbsp; And his work is a branch off the original work for the DotNetNuke base by Charles Nurse, so full credit to him as well.&amp;nbsp; I don&amp;#39;t claim credit for much of it at all, but by downloading it you are subjecting yourselef to the license of the DotNetNuke framework, so play nicely and attribute credit where credit is due.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;/div&gt;&lt;/span&gt;   &lt;/p&gt;   &lt;p&gt;     &lt;span id="dnn_ctr373_MainView_ViewEntry_lblCopyright" class="blog_copyright"&gt;Copyright Bruce Chapman 2007&lt;/span&gt;   &lt;/p&gt;&lt;br&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-4698844307638798455?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/4698844307638798455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=4698844307638798455' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/4698844307638798455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/4698844307638798455'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/09/rewriting-dotnetnuke-url-rewriter.html' title='Rewriting the DotNetNuke Url Rewriter Module'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-6151218628823648998</id><published>2008-08-13T11:22:00.000+06:00</published><updated>2008-08-13T11:23:27.342+06:00</updated><title type='text'></title><content type='html'>&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://i.netcarshow.com/ncs_show.swf?c=BMW&amp;amp;m=2008-M-Zero_Concept"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://i.netcarshow.com/ncs_show.swf?c=BMW&amp;amp;m=2008-M-Zero_Concept" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-6151218628823648998?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/6151218628823648998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=6151218628823648998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/6151218628823648998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/6151218628823648998'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/08/blog-post.html' title=''/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-7158432301385186335</id><published>2008-07-22T18:47:00.001+06:00</published><updated>2008-07-22T18:47:30.385+06:00</updated><title type='text'>Locking in Microsoft SQL Server</title><content type='html'>&lt;div dir="ltr"&gt;&lt;h1&gt;&lt;font face="Verdana" size="2"&gt;&lt;u&gt;Introduction&lt;/u&gt;&lt;/font&gt;&lt;/h1&gt;In this article, I want to tell you about SQL Server 7.0/2000 Transaction Isolation Levels, what kinds of Transaction Isolation Levels exist, and how you can set the appropriate Transaction Isolation Level, about Lock types and Locking optimizer hints, about deadlocks, and about how you can view locks by using the &lt;b&gt;sp_lock&lt;/b&gt; stored procedure.&lt;br&gt;  &lt;h2&gt;&lt;font size="2"&gt;&lt;u&gt;Transaction Isolation Levels&lt;/u&gt;&lt;/font&gt;&lt;/h2&gt;There are four isolation levels:&lt;br&gt;&lt;br&gt; &lt;li&gt;READ UNCOMMITTED  &lt;li&gt;READ COMMITTED  &lt;li&gt;REPEATABLE READ  &lt;li&gt;SERIALIZABLE&lt;br&gt;&lt;br&gt;Microsoft SQL Server supports all of these Transaction Isolation Levels and can separate &lt;b&gt;REPEATABLE READ&lt;/b&gt; and &lt;b&gt;SERIALIZABLE&lt;/b&gt;.&lt;br&gt;&lt;br&gt;Let me to describe each isolation level.&lt;br&gt;&lt;br&gt; &lt;h3&gt;&lt;font size="2"&gt;&lt;u&gt;READ UNCOMMITTED&lt;/u&gt;&lt;/font&gt;&lt;/h3&gt;When it&amp;#39;s used, SQL Server not issue shared locks while reading data. So, you can read an uncommitted transaction that might get rolled back later. This isolation level is also called dirty read. This is the lowest isolation level. It ensures only that a physically corrupt data will not be read.&lt;br&gt; &lt;br&gt; &lt;h3&gt;&lt;u&gt;&lt;font size="2"&gt;READ COMMITTED&lt;/font&gt;&lt;/u&gt;&lt;/h3&gt;This is the default isolation level in SQL Server. When it&amp;#39;s used, SQL Server will use shared locks while reading data. It ensures that a physically corrupt data will not be read and will never read data that another application has changed and not yet committed, but it not ensures that the data will not be changed before the end of the transaction.&lt;br&gt; &lt;br&gt; &lt;h3&gt;&lt;font size="2"&gt;&lt;u&gt;REPEATABLE READ&lt;/u&gt;&lt;/font&gt;&lt;/h3&gt;When it&amp;#39;s used, the dirty reads and nonrepeatable reads cannot occur. It means that locks will be placed on all data that is used in a query, and another transactions cannot update the data.&lt;br&gt; &lt;br&gt;This is the definition of nonrepeatable read from SQL Server Books Online:&lt;br&gt;&lt;br&gt; &lt;table width="100%"&gt; &lt;tbody&gt; &lt;tr bgcolor="#dcdcdc"&gt; &lt;td&gt;&lt;pre&gt;nonrepeatable read When a transaction reads the same row more than one time, and between the two (or more) reads, a separate transaction modifies that row. Because the row was modified between reads within the same transaction, each read produces different values, which introduces inconsistency. &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;pre&gt;&lt;/pre&gt; &lt;h3&gt;&lt;u&gt;&lt;font size="2"&gt;SERIALIZABLE&lt;/font&gt;&lt;/u&gt;&lt;/h3&gt;Most restrictive isolation level. When it&amp;#39;s used, the phantom values cannot occur. It prevents other users from updating or inserting rows into the data set until the transaction will be completed.&lt;br&gt; &lt;br&gt;This is the definition of phantom from SQL Server Books Online:&lt;br&gt;&lt;br&gt; &lt;table width="100%"&gt; &lt;tbody&gt; &lt;tr bgcolor="#dcdcdc"&gt; &lt;td&gt;&lt;pre&gt;phantom Phantom behavior occurs when a transaction attempts to select a row that does not exist and a second transaction inserts the row before the first transaction finishes. If the row is inserted, the row appears as a phantom to the first transaction, inconsistently appearing and disappearing. &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;pre&gt;&lt;/pre&gt;You can set the appropriate isolation level for an entire SQL Server session by using the &lt;b&gt;SET TRANSACTION ISOLATION LEVEL&lt;/b&gt; statement.&lt;br&gt;This is the syntax from SQL Server Books Online:&lt;br&gt; &lt;br&gt; &lt;table width="100%"&gt; &lt;tbody&gt; &lt;tr bgcolor="#dcdcdc"&gt; &lt;td&gt;&lt;pre&gt;SET TRANSACTION ISOLATION LEVEL      {         READ COMMITTED          | READ UNCOMMITTED          | REPEATABLE READ          | SERIALIZABLE     } &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;pre&gt;&lt;/pre&gt;You can use the &lt;b&gt;DBCC USEROPTIONS&lt;/b&gt; statement to determine the Transaction Isolation Level currently set. This command returns the set options that are active for the current connection. This is the example:&lt;br&gt; &lt;br&gt; &lt;table width="100%"&gt; &lt;tbody&gt; &lt;tr bgcolor="#dcdcdc"&gt; &lt;td&gt;&lt;pre&gt;SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED GO DBCC USEROPTIONS GO &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;pre&gt;&lt;/pre&gt; &lt;h2&gt;&lt;a name="part_3"&gt;&lt;/a&gt;&lt;font size="2"&gt;&lt;u&gt;Lock types&lt;/u&gt;&lt;/font&gt;&lt;/h2&gt;There are three main types of locks that SQL Server 7.0/2000 uses:&lt;br&gt;&lt;br&gt; &lt;li&gt;Shared locks  &lt;li&gt;Update locks  &lt;li&gt;Exclusive locks&lt;br&gt;&lt;br&gt;&lt;b&gt;Shared&lt;/b&gt; locks are used for operations that do not change or update data, such as a SELECT statement.&lt;br&gt;&lt;br&gt;&lt;b&gt;Update&lt;/b&gt; locks are used when SQL Server intends to modify a page, and later promotes the update page lock to an exclusive page lock before actually making the changes.&lt;br&gt; &lt;br&gt;&lt;b&gt;Exclusive&lt;/b&gt; locks are used for the data modification operations, such as UPDATE, INSERT, or DELETE.&lt;br&gt;&lt;br&gt;&lt;b&gt;Shared&lt;/b&gt; locks are compatible with other &lt;b&gt;Shared&lt;/b&gt; locks or &lt;b&gt;Update&lt;/b&gt; locks.&lt;br&gt;&lt;br&gt;&lt;b&gt;Update&lt;/b&gt; locks are compatible with &lt;b&gt;Shared&lt;/b&gt; locks only.&lt;br&gt; &lt;br&gt;&lt;b&gt;Exclusive&lt;/b&gt; locks are not compatible with other lock types.&lt;br&gt;&lt;br&gt;Let me to describe it on the real example. There are four processes, which attempt to lock the same page of the same table. These processes start one after another, so Process1 is the first process, Process2 is the second process and so on.&lt;br&gt; &lt;br&gt;Process1 : SELECT&lt;br&gt;Process2 : SELECT&lt;br&gt;Process3 : UPDATE&lt;br&gt;Process4 : SELECT&lt;br&gt;&lt;br&gt;Process1 sets the &lt;b&gt;Shared&lt;/b&gt; lock on the page, because there are no another locks on this page.&lt;br&gt;Process2 sets the &lt;b&gt;Shared&lt;/b&gt; lock on the page, because &lt;b&gt;Shared&lt;/b&gt; locks are compatible with other &lt;b&gt;Shared&lt;/b&gt; locks.&lt;br&gt; Process3 wants to modify data and wants to set &lt;b&gt;Exclusive&lt;/b&gt; lock, but it cannot make it before Process1 and Process2 will be finished, because &lt;b&gt;Exclusive&lt;/b&gt; lock is not compatible with other lock types. So, Process3 sets &lt;b&gt;Update&lt;/b&gt; lock.&lt;br&gt; Process4 cannot set &lt;b&gt;Shared&lt;/b&gt; lock on the page before Process3 will be finished. So, there is no &lt;b&gt;Lock starvation&lt;/b&gt;. &lt;b&gt;Lock starvation&lt;/b&gt; occurs when read transactions can monopolize a table or page, forcing a write transaction to wait indefinitely. So, Process4 waits before Process3 will be finished.&lt;br&gt; After Process1 and Process2 were finished, Process3 transfer &lt;b&gt;Update&lt;/b&gt; lock into &lt;b&gt;Exclusive&lt;/b&gt; lock to modify data. After Process3 was finished, Process4 sets the &lt;b&gt;Shared&lt;/b&gt; lock on the page to select data.&lt;br&gt;&lt;br&gt;  &lt;h2&gt;&lt;a name="part_4"&gt;&lt;/a&gt;&lt;font size="2"&gt;&lt;u&gt;Locking optimizer hints&lt;/u&gt;&lt;/font&gt;&lt;/h2&gt;SQL Server 7.0/2000 supports the following Locking optimizer hints:&lt;br&gt;&lt;br&gt; &lt;li&gt;NOLOCK  &lt;li&gt;HOLDLOCK  &lt;li&gt;UPDLOCK  &lt;li&gt;TABLOCK  &lt;li&gt;PAGLOCK  &lt;li&gt;TABLOCKX  &lt;li&gt;READCOMMITTED  &lt;li&gt;READUNCOMMITTED  &lt;li&gt;REPEATABLEREAD  &lt;li&gt;SERIALIZABLE  &lt;li&gt;READPAST  &lt;li&gt;ROWLOCK&lt;br&gt;&lt;br&gt;&lt;b&gt;NOLOCK&lt;/b&gt; is also known as &amp;quot;dirty reads&amp;quot;. This option directs SQL Server not to issue shared locks and not to honor exclusive locks. So, if this option is specified, it is possible to read an uncommitted transaction. This results in higher concurrency and in lower consistency.&lt;br&gt; &lt;br&gt;&lt;b&gt;HOLDLOCK&lt;/b&gt; directs SQL Server to hold a shared lock until completion of the transaction in which HOLDLOCK is used. You cannot use HOLDLOCK in a SELECT statement that includes the FOR BROWSE option. HOLDLOCK is equivalent to SERIALIZABLE.&lt;br&gt; &lt;br&gt;&lt;b&gt;UPDLOCK&lt;/b&gt; instructs SQL Server to use update locks instead of shared locks while reading a table and holds them until the end of the command or transaction.&lt;br&gt;&lt;br&gt;&lt;b&gt;TABLOCK&lt;/b&gt; takes a shared lock on the table that is held until the end of the command. If you also specify HOLDLOCK, the lock is held until the end of the transaction.&lt;br&gt; &lt;br&gt;&lt;b&gt;PAGLOCK&lt;/b&gt; is used by default. Directs SQL Server to use shared page locks.&lt;br&gt;&lt;br&gt;&lt;b&gt;TABLOCKX&lt;/b&gt; takes an exclusive lock on the table that is held until the end of the command or transaction.&lt;br&gt;&lt;br&gt;&lt;b&gt;READCOMMITTED&lt;/b&gt;&lt;br&gt; Perform a scan with the same locking semantics as a transaction running at the READ COMMITTED isolation level. By default, SQL Server operates at this isolation level.&lt;br&gt;&lt;br&gt;&lt;b&gt;READUNCOMMITTED&lt;/b&gt;&lt;br&gt;Equivalent to NOLOCK.&lt;br&gt; &lt;br&gt;&lt;b&gt;REPEATABLEREAD&lt;/b&gt;&lt;br&gt;Perform a scan with the same locking semantics as a transaction running at the REPEATABLE READ isolation level.&lt;br&gt;&lt;br&gt;&lt;b&gt;SERIALIZABLE&lt;/b&gt;&lt;br&gt;Perform a scan with the same locking semantics as a transaction running at the SERIALIZABLE isolation level. Equivalent to HOLDLOCK.&lt;br&gt; &lt;br&gt;&lt;b&gt;READPAST&lt;/b&gt;&lt;br&gt;Skip locked rows. This option causes a transaction to skip over rows locked by other transactions that would ordinarily appear in the result set, rather than block the transaction waiting for the other transactions to release their locks on these rows. The READPAST lock hint applies only to transactions operating at READ COMMITTED isolation and will read only past row-level locks. Applies only to the SELECT statement.&lt;br&gt; You can only specify the READPAST lock in the READ COMMITTED or REPEATABLE READ isolation levels.&lt;br&gt;&lt;br&gt;&lt;b&gt;ROWLOCK&lt;/b&gt;&lt;br&gt;Use row-level locks rather than use the coarser-grained page- and table-level locks.&lt;br&gt;&lt;br&gt;You can specify one of these locking options in a SELECT statement.&lt;br&gt; This is the example:&lt;br&gt;&lt;br&gt;&lt;i&gt;SELECT au_fname FROM pubs..authors (holdlock)&lt;/i&gt;&lt;br&gt;&lt;br&gt; &lt;h2&gt;&lt;a name="part_5"&gt;&lt;/a&gt;&lt;font size="2"&gt;&lt;u&gt;Deadlocks&lt;/u&gt;&lt;/font&gt;&lt;/h2&gt;Deadlock occurs when two users have locks on separate objects and each user wants a lock on the other&amp;#39;s object. For example, User1 has a lock on object &amp;quot;A&amp;quot; and wants a lock on object &amp;quot;B&amp;quot; and User2 has a lock on object &amp;quot;B&amp;quot; and wants a lock on object &amp;quot;A&amp;quot;. In this case, SQL Server ends a deadlock by choosing the user, who will be a deadlock victim. After that, SQL Server rolls back the breaking user&amp;#39;s transaction, sends message number 1205 to notify the user&amp;#39;s application about breaking, and then allows the nonbreaking user&amp;#39;s process to continue.&lt;br&gt; &lt;br&gt;You can decide which connection will be the candidate for deadlock victim by using &lt;b&gt;SET DEADLOCK_PRIORITY&lt;/b&gt;. In other case, SQL Server selects the deadlock victim by choosing the process that completes the circular chain of locks.&lt;br&gt; &lt;br&gt;So, in a multiuser situation, your application should check the error 1205 to indicate that the transaction was rolled back, and if it&amp;#39;s so, restart the transaction.&lt;br&gt;&lt;br&gt;&lt;b&gt;Note.&lt;/b&gt; To reduce the chance of a deadlock, you should minimize the size of transactions and transaction times.&lt;br&gt; &lt;br&gt; &lt;h2&gt;&lt;a name="part_6"&gt;&lt;/a&gt;&lt;font size="2"&gt;&lt;u&gt;View locks (sp_lock)&lt;/u&gt;&lt;/font&gt;&lt;/h2&gt;Sometimes you need a reference to information about locks. Microsoft recommends using the &lt;b&gt;sp_lock&lt;/b&gt; system stored procedure to report locks information. This very useful procedure returns the information about SQL Server process ID, which lock the data, about locked database, about locked table ID, about locked page and about type of locking (locktype column).&lt;br&gt; &lt;br&gt;This is the example of using the &lt;b&gt;sp_lock&lt;/b&gt; system stored procedure:&lt;br&gt;&lt;br&gt; &lt;table width="100%"&gt; &lt;tbody&gt; &lt;tr bgcolor="#dcdcdc"&gt; &lt;td&gt;&lt;pre&gt;spid   locktype                            table_id    page        dbname ------ ----------------------------------- ----------- ----------- --------------- 11     Sh_intent                           688005482   0           master 11     Ex_extent                           0           336         tempdb &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;pre&gt;&lt;/pre&gt;The information, returned by &lt;b&gt;sp_lock&lt;/b&gt; system stored procedure needs in some clarification, because it&amp;#39;s difficult to understand database name, object name and index name by their ID numbers.&lt;br&gt; &lt;br&gt;Check the link below if you need to get user name, host name, database name, index name object name and object owner instead of their ID numbers:&lt;br&gt;&lt;a href="http://www.mssqlcity.com/Articles/Adm/LockView.htm"&gt;Detailed locking view: sp_lock2&lt;/a&gt;&lt;br&gt; &lt;br&gt; &lt;h2&gt;&lt;a name="part_7"&gt;&lt;/a&gt;&lt;font size="2"&gt;&lt;u&gt;Literature&lt;/u&gt;&lt;/font&gt;&lt;/h2&gt;1. SQL Server Books Online&lt;br&gt;&lt;br&gt;2. &lt;a href="http://www.mssqlcity.com/Articles/General/TIL.htm"&gt;Transaction Isolation Level&lt;/a&gt;&lt;br&gt;&lt;br&gt;3. &lt;a href="http://www.mssqlcity.com/Articles/SQL65/SQL65Locks.htm"&gt;Locking in SQL Server 6.5&lt;/a&gt;&lt;br&gt; &lt;br&gt;4. &lt;a href="http://www.mssqlcity.com/Articles/Adm/LockView.htm"&gt;Detailed locking view: sp_lock2&lt;/a&gt;&lt;br&gt;&lt;br&gt;5. &lt;a href="http://support.microsoft.com/support/kb/articles/Q169/9/60.ASP" target="_blank"&gt;INF: Analyzing and Avoiding Deadlocks in SQL Server&lt;/a&gt;&lt;/li&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;hr&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Article By:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;h1&gt;&lt;font face="Verdana" size="2"&gt;&lt;b&gt;&lt;i&gt;Alexander Chigrik&lt;/i&gt;&lt;/b&gt;&lt;br&gt;&lt;a href="mailto:chigrik@mssqlcity.com"&gt;chigrik@mssqlcity.com&lt;/a&gt;&lt;/font&gt;&lt;/h1&gt; &lt;h1&gt;&lt;font face="Verdana" size="2"&gt;&lt;a href="http://www.mssqlcity.com/Articles/Adm/SQL70Locks.htm"&gt;http://www.mssqlcity.com/Articles/Adm/SQL70Locks.htm&lt;/a&gt;&lt;/font&gt;&lt;/h1&gt; &lt;h1&gt; &lt;hr&gt; &lt;br&gt;&lt;br&gt;&lt;/h1&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-7158432301385186335?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/7158432301385186335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=7158432301385186335' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/7158432301385186335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/7158432301385186335'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/07/locking-in-microsoft-sql-server.html' title='Locking in Microsoft SQL Server'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-3788568461222915901</id><published>2008-07-17T20:52:00.001+06:00</published><updated>2008-07-17T20:52:39.356+06:00</updated><title type='text'>DIV Rounded Corners</title><content type='html'>&lt;div dir="ltr"&gt;&lt;h3&gt;CSS&lt;/h3&gt; &lt;pre&gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br&gt;.spiffy{display:block}&lt;br&gt;.spiffy *{&lt;br&gt;  display:block;&lt;br&gt;  height:1px;&lt;br&gt;  overflow:hidden;&lt;br&gt;  font-size:.01em;&lt;br&gt;  background:#B3A400}&lt;br&gt;.spiffy1{&lt;br&gt;  margin-left:3px;&lt;br&gt;   margin-right:3px;&lt;br&gt;  padding-left:1px;&lt;br&gt;  padding-right:1px;&lt;br&gt;  border-left:1px solid #ded791;&lt;br&gt;  border-right:1px solid #ded791;&lt;br&gt;  background:#c6ba3f}&lt;br&gt;.spiffy2{&lt;br&gt;  margin-left:1px;&lt;br&gt;  margin-right:1px;&lt;br&gt;   padding-right:1px;&lt;br&gt;  padding-left:1px;&lt;br&gt;  border-left:1px solid #f7f5e5;&lt;br&gt;  border-right:1px solid #f7f5e5;&lt;br&gt;  background:#c1b530}&lt;br&gt;.spiffy3{&lt;br&gt;  margin-left:1px;&lt;br&gt;  margin-right:1px;&lt;br&gt;  border-left:1px solid #c1b530;&lt;br&gt;   border-right:1px solid #c1b530;}&lt;br&gt;.spiffy4{&lt;br&gt;  border-left:1px solid #ded791;&lt;br&gt;  border-right:1px solid #ded791}&lt;br&gt;.spiffy5{&lt;br&gt;  border-left:1px solid #c6ba3f;&lt;br&gt;  border-right:1px solid #c6ba3f}&lt;br&gt;.spiffyfg{&lt;br&gt;   background:#B3A400}&lt;br&gt;&amp;lt;/style&amp;gt;&lt;br&gt;&lt;/pre&gt;  	&lt;h3&gt;HTML&lt;/h3&gt; &lt;pre&gt;&amp;lt;div&amp;gt;&lt;br&gt;  &amp;lt;b class=&amp;quot;spiffy&amp;quot;&amp;gt;&lt;br&gt;  &amp;lt;b class=&amp;quot;spiffy1&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/b&amp;gt;&lt;br&gt;  &amp;lt;b class=&amp;quot;spiffy2&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/b&amp;gt;&lt;br&gt;  &amp;lt;b class=&amp;quot;spiffy3&amp;quot;&amp;gt;&amp;lt;/b&amp;gt;&lt;br&gt;   &amp;lt;b class=&amp;quot;spiffy4&amp;quot;&amp;gt;&amp;lt;/b&amp;gt;&lt;br&gt;  &amp;lt;b class=&amp;quot;spiffy5&amp;quot;&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/b&amp;gt;&lt;br&gt;&lt;br&gt;  &amp;lt;div class=&amp;quot;spiffyfg&amp;quot;&amp;gt;&lt;br&gt;    &amp;lt;!-- content goes here --&amp;gt;&lt;br&gt;  &amp;lt;/div&amp;gt;&lt;br&gt;&lt;br&gt;   &amp;lt;b class=&amp;quot;spiffy&amp;quot;&amp;gt;&lt;br&gt;  &amp;lt;b class=&amp;quot;spiffy5&amp;quot;&amp;gt;&amp;lt;/b&amp;gt;&lt;br&gt;  &amp;lt;b class=&amp;quot;spiffy4&amp;quot;&amp;gt;&amp;lt;/b&amp;gt;&lt;br&gt;  &amp;lt;b class=&amp;quot;spiffy3&amp;quot;&amp;gt;&amp;lt;/b&amp;gt;&lt;br&gt;  &amp;lt;b class=&amp;quot;spiffy2&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/b&amp;gt;&lt;br&gt;   &amp;lt;b class=&amp;quot;spiffy1&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/b&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-3788568461222915901?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/3788568461222915901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=3788568461222915901' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/3788568461222915901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/3788568461222915901'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/07/div-rounded-corners.html' title='DIV Rounded Corners'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-4731366946479780588</id><published>2008-07-16T18:53:00.002+06:00</published><updated>2009-01-21T18:07:15.830+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Word Conversion'/><category scheme='http://www.blogger.com/atom/ns#' term='Word to PDF'/><category scheme='http://www.blogger.com/atom/ns#' term='Word Conversion'/><category scheme='http://www.blogger.com/atom/ns#' term='Doc to PDF'/><category scheme='http://www.blogger.com/atom/ns#' term='PDF Conversion'/><title type='text'>Convert DOC to PDF Files (Convert Word To PDF Files) using Command in ASP.Net</title><content type='html'>&lt;div dir="ltr"&gt;I used &lt;a href="http://www.softinterface.com/Convert-Doc/Features/Convert-DOC-to-PDF.htm"&gt;http://www.softinterface.com/Convert-Doc/Features/Convert-DOC-to-PDF.htm&lt;/a&gt; and then Executed the command from Asp.Net to conver the MS Word files to PDF.&lt;br&gt; &lt;br&gt;&lt;u&gt;&lt;b&gt;Code&lt;br&gt;&lt;br&gt;&lt;/b&gt;&lt;/u&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // write the command&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string exec = TextBox1.Text;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create the ProcessInfo object&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(&amp;quot;cmd.exe&amp;quot;);&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; psi.UseShellExecute = false;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; psi.RedirectStandardOutput = true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; psi.RedirectStandardInput = true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; psi.RedirectStandardError = true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The path where Application is installed&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; psi.WorkingDirectory = &amp;quot;C:\\Program Files\\Softinterface, Inc\\Convert Doc&amp;quot;;&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Start the process&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Process proc = System.Diagnostics.Process.Start(psi);&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Open the batch file for reading&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //System.IO.StreamReader strm = System.IO.File.OpenText(strFilePath);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.IO.StreamReader strm = proc.StandardError;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Attach the output for reading&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.IO.StreamReader sOut = proc.StandardOutput;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Attach the in for writing&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.IO.StreamWriter sIn = proc.StandardInput;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sIn.WriteLine(exec);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strm.Close();&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sIn.WriteLine(&amp;quot;EXIT&amp;quot;);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Close the process&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc.Close();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Close the io Streams;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sIn.Close();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sOut.Close();&lt;br&gt;&lt;br&gt;&lt;u&gt;&lt;b&gt;ASPX File&lt;/b&gt;&lt;/u&gt;&lt;br&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;lt;div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TextBox ID=&amp;quot;TextBox1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Button ID=&amp;quot;Button1&amp;quot; runat=&amp;quot;server&amp;quot; OnClick=&amp;quot;Button1_Click&amp;quot; Text=&amp;quot;Button&amp;quot; /&amp;gt;&amp;lt;/div&amp;gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;&lt;u&gt;&lt;b&gt;Commands ( Ref: &lt;a href="http://www.softinterface.com/"&gt;http://www.softinterface.com/&lt;/a&gt; )&lt;/b&gt;&lt;/u&gt;&lt;br&gt;&lt;h2 style="font-family: arial,sans-serif;"&gt;&lt;font size="2"&gt;Converting a Single File&lt;/font&gt;&lt;/h2&gt;     &lt;p style="font-family: arial,sans-serif;" class="MsoNormal"&gt;&lt;font size="2"&gt;To convert a      single file, say &lt;b&gt;D:\MyFolder\Doc1.DOC&lt;/b&gt; to &lt;b&gt;C:\Results      Folder\Doc1.PDF&lt;/b&gt; use the following syntax:&lt;/font&gt;&lt;/p&gt;     &lt;p style="font-family: arial,sans-serif;" class="MsoNormal"&gt;&lt;font size="2"&gt;&lt;b&gt;     &amp;nbsp;&amp;nbsp; ConvertDoc /&lt;span style="color: blue;"&gt;S     &lt;/span&gt;&amp;quot;D:\MyFolder\Doc1.DOC&amp;quot; /&lt;span style="color: blue;"&gt;T&lt;/span&gt;      &amp;quot;C:\Results Folder\Doc1.PDF&amp;quot; /&lt;span style="color: blue;"&gt;F&lt;/span&gt;9      /&lt;span style="color: blue;"&gt;C&lt;/span&gt;12 /&lt;span style="color: blue;"&gt;M&lt;/span&gt;2      /&lt;span style="color: blue;"&gt;V&lt;/span&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;     &lt;ul style="font-family: arial,sans-serif;"&gt;&lt;li&gt;      &lt;p class="MsoNormal"&gt;&lt;font size="2"&gt;The /&lt;span style="color: blue;"&gt;S&lt;/span&gt;       and /&lt;span style="color: blue;"&gt;T&lt;/span&gt; switches above       specify &lt;b&gt;&lt;span style="color: blue;"&gt;S&lt;/span&gt;&lt;/b&gt;ource       (input) and &lt;b&gt;&lt;span style="color: blue;"&gt;T&lt;/span&gt;&lt;/b&gt;arget       (output) path respectively and are both required when       converting a single file.&amp;nbsp; It is always a good idea to use       double quotes around the path especially if there are space       characters within the path.&lt;/font&gt;      &lt;/p&gt;&lt;/li&gt;&lt;li&gt;      &lt;p class="MsoNormal"&gt;&lt;font size="2"&gt;The /&lt;span style="color: blue;"&gt;M&lt;/span&gt;2       switch tells 'Convert Doc' to use the &lt;b&gt;'Convert Doc'       method&lt;/b&gt; (it is one of 3 different possible      &lt;span style="display: none; font-style: italic;"&gt;Conversion       Methods&lt;/span&gt;).&amp;nbsp; &lt;/font&gt;      &lt;/p&gt;&lt;/li&gt;&lt;li&gt;      &lt;p class="MsoNormal"&gt;&lt;font size="2"&gt;/&lt;span style="color: blue;"&gt;F&lt;/span&gt;9       is the original (input) file type, which in this case is a      &lt;b&gt;word DOC&lt;/b&gt; file.&amp;nbsp; Looking up the file types within the&lt;i&gt;       File Type Constants Specification&lt;/i&gt; for the &lt;b&gt;'Convert       Doc' method&lt;/b&gt; will show that the numeric value of &lt;b&gt;9&lt;/b&gt;       corresponds to a &lt;b&gt;DOC&lt;/b&gt; file. &lt;/font&gt;      &lt;/p&gt;&lt;/li&gt;&lt;li&gt;      &lt;p class="MsoNormal"&gt;&lt;font size="2"&gt;/&lt;span style="color: blue;"&gt;C&lt;/span&gt;12       is the target (output) file type, which in this case is a &lt;b&gt;      PDF&lt;/b&gt; file.&amp;nbsp; Looking up the file types within the &lt;i&gt;File       Type Constants Specification&lt;/i&gt; for the &lt;b&gt;'Convert Doc'       method&lt;/b&gt; will show that the numeric value of &lt;b&gt;12&lt;/b&gt;       corresponds to a &lt;b&gt;PDF&lt;/b&gt; file. &lt;/font&gt;      &lt;/p&gt;&lt;/li&gt;&lt;li&gt;      &lt;p class="MsoNormal"&gt;&lt;font size="2"&gt;Finally,       the /&lt;span style="color: blue;"&gt;V&lt;/span&gt; (for      &lt;span style="color: blue;"&gt;V&lt;/span&gt;erbose) switch is used to       give instant feedback by having the program report the       status of the conversion with a message box.&amp;nbsp; You can remove       this once you have perfected your command line       specification.&amp;nbsp; You can also (or instead of /&lt;span style="color: blue;"&gt;V&lt;/span&gt;)       create a &lt;b&gt;&lt;span style="color: blue;"&gt;L&lt;/span&gt;&lt;/b&gt;og file       that will contain the results of the conversion by using the       /&lt;b&gt;&lt;span style="color: blue;"&gt;L&lt;/span&gt;&lt;/b&gt; switch.&lt;/font&gt;      &lt;/p&gt;&lt;/li&gt;&lt;li&gt;      &lt;p class="MsoNormal"&gt;&lt;font size="2"&gt;HINT: You may use the /&lt;b&gt;&lt;span style="color: blue;"&gt;W&lt;/span&gt;&lt;/b&gt;       switch to specify a File Open password.&amp;nbsp; The Example below       makes the word Apples the password to open the newly created       PDF file:&lt;/font&gt;&lt;/p&gt;      &lt;p class="MsoNormal"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConvertDoc.EXE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&lt;span style="color: blue;"&gt;S&lt;/span&gt;       &amp;quot;c:\input files\tryme.doc&amp;quot; /&lt;span style="color: blue;"&gt;T&lt;/span&gt;       &amp;quot;c:\input files\tryme.pdf&amp;quot; /&lt;span style="color: blue;"&gt;F&lt;/span&gt;9       /&lt;span style="color: blue;"&gt;C&lt;/span&gt;12 /&lt;span style="color: blue;"&gt;M&lt;/span&gt;2       /&lt;span style="color: blue;"&gt;V&lt;/span&gt; /&lt;b&gt;&lt;span style="color: blue;"&gt;W&lt;/span&gt;Apples&lt;/b&gt;&lt;/font&gt;     &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;     &lt;div style="border-style: solid none; border-color: windowtext -moz-use-text-color; border-width: 1pt medium; padding: 1pt 0in; margin-left: 5.75pt; margin-right: 0in; font-family: arial,sans-serif;"&gt;      &lt;p class="Note" style="margin-left: 0in;"&gt;      &lt;font size="2"&gt;Note: It is highly encouraged       that you use the Verbose (/&lt;span style="color: blue;"&gt;V&lt;/span&gt;)       switch initially to see what the status of your conversion       is and to help you perfect your command line.&amp;nbsp; When in       verbose mode the program will tell you what went wrong or       right with your command line using message boxes.&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-4731366946479780588?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/4731366946479780588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=4731366946479780588' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/4731366946479780588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/4731366946479780588'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/07/convert-doc-to-pdf-files-convert-word.html' title='Convert DOC to PDF Files (Convert Word To PDF Files) using Command in ASP.Net'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-7725769034458302869</id><published>2008-07-16T12:45:00.001+06:00</published><updated>2008-07-16T12:48:05.989+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TextBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Numeric TextBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Input'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net TextBox'/><category scheme='http://www.blogger.com/atom/ns#' term='number input'/><title type='text'>Numeric TextBox (ASP.Net / HTML Input)</title><content type='html'>&lt;div dir="ltr"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;&amp;lt;&lt;/div&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;language&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="javascript"&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;p&gt;function&lt;span style="font-size:85%;"&gt; KeyCheck(e)&lt;/span&gt;&lt;/p&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="font-size:85%;"&gt; KeyID = (window.&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;event&lt;/span&gt;&lt;span style="font-size:85%;"&gt;) ? &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;event&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.keyCode : e.which;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="font-size:85%;"&gt;((KeyID &amp;gt;= 65 &amp;amp;&amp;amp; KeyID &amp;lt;= 90) || (KeyID &amp;gt;= 97 &amp;amp;&amp;amp; KeyID &amp;lt;= 122) || (KeyID &amp;gt;= 33 &amp;amp;&amp;amp; KeyID &amp;lt;= 47) ||&lt;/span&gt;&lt;/p&gt; &lt;p&gt;(KeyID &amp;gt;= 58 &amp;amp;&amp;amp; KeyID &amp;lt;= 64) || (KeyID &amp;gt;= 91 &amp;amp;&amp;amp; KeyID &amp;lt;= 96) || (KeyID &amp;gt;= 123 &amp;amp;&amp;amp; KeyID &amp;lt;= 126))&lt;/p&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;}&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; &lt;div&gt;&amp;lt;/&lt;/div&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;strong&gt;&lt;u&gt;HTML Text Box&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; &lt;p&gt;&amp;lt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;input&lt;/span&gt;&lt;span style="font-size:85%;color:#000000;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="text"&lt;/span&gt;&lt;span style="font-size:85%;color:#000000;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="txt_TextBox"&lt;/span&gt;&lt;span style="font-size:85%;color:#000000;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;onkeypress&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="return KeyCheck(event);"&lt;/span&gt;&lt;span style="font-size:85%;color:#000000;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="font-size:85%;color:#000000;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;style&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="width: 28px"&lt;/span&gt;&lt;span style="font-size:85%;color:#000000;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;strong&gt;&lt;u&gt;ASP.Net TextBox&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TextBox&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="txt_ASPTextBox"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TextBox&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;strong&gt;&lt;u&gt;Code Behind for Asp.Net TextBox&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;txt_ASPTextBox.Attributes.Add(&lt;span style="color:#a31515;"&gt;"onkeypress","return KeyCheck(event);"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-7725769034458302869?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/7725769034458302869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=7725769034458302869' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/7725769034458302869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/7725769034458302869'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/07/numeric-textbox-aspnet-html-input.html' title='Numeric TextBox (ASP.Net / HTML Input)'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-2979276306190756978</id><published>2008-07-16T12:28:00.001+06:00</published><updated>2008-07-16T12:49:21.541+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BindData'/><category scheme='http://www.blogger.com/atom/ns#' term='Add GridView Rows'/><category scheme='http://www.blogger.com/atom/ns#' term='Update GridView'/><category scheme='http://www.blogger.com/atom/ns#' term='Insert Rows'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView'/><category scheme='http://www.blogger.com/atom/ns#' term='Copy Rows'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView rows'/><title type='text'>Insert / Delete / Update Row in DataGrid at Runtime from Other GridView</title><content type='html'>&lt;div dir="ltr"&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;div&gt;&lt;strong&gt;&lt;u&gt;Grid 1&lt;/u&gt;&lt;/strong&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;GridView&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="gv_Source"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;AutoGenerateColumns&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="False"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;OnRowCommand&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="gv_Source_RowCommand"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;Width&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="100%"&amp;gt;&lt;/span&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Columns&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;BoundField&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;DataField&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="TemplateName"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;HeaderText&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="Template Name"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TemplateField&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;input&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="text"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="txt_TextBox"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;style&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="width: 28px"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Label&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="lbl_Required"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;Font-Bold&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="True"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ForeColor&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="Red"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;Text&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="*"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;Visible&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="False"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Label&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TemplateField&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TemplateField&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;LinkButton&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="lnkbt_SelectTemplates"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;Text&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="Select"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;CommandArgument&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;='&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;%# ((GridViewRow)Container).RowIndex %&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;'&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ValidationGroup&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="SelectGroup"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;LinkButton&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TemplateField&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Columns&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;GridView&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;strong&gt;&lt;u&gt;Grid2&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;GridView&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="gv_Selected"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;AutoGenerateColumns&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="False"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;HorizontalAlign&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;Width&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="100%"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;OnRowCommand&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="gv_Selected_RowCommand"&amp;gt;&lt;/span&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Columns&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;BoundField&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;DataField&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="Column1"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;HeaderText&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="Column Name"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;BoundField&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;DataField&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="Column2"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;HeaderText&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="Column2 Nam"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TemplateField&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;LinkButton&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="lnkbt_Delete"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;Text&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="Remove"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;CommandArgument&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;='&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;%# ((GridViewRow)Container).RowIndex %&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;'&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;CausesValidation&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="False"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;OnClientClick&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="return confirm('Are you sure?');"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;LinkButton&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TemplateField&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Columns&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;GridView&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;div&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;CODE BEHIND&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;strong&gt;&lt;u&gt;Grid 1 RowCommand (Add to Grid 2)&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;protected&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="font-size:85%;"&gt; gv_Source_RowCommand(&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="font-size:85%;"&gt; sender, &lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;GridViewCommandEventArgs&lt;/span&gt;&lt;span style="font-size:85%;"&gt; e) &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;GridViewRow&lt;/span&gt;&lt;span style="font-size:85%;"&gt; gv_row = gv_Source.Rows[&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.Parse(e.CommandArgument.ToString())]; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;DataTable&lt;/span&gt;&lt;span style="font-size:85%;"&gt; dt = &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;DataTable&lt;/span&gt;&lt;span style="font-size:85%;"&gt;(&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"Selected"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;); &lt;p&gt;dt.Columns.Add(&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"Column1"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;); &lt;p&gt;dt.Columns.Add(&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"Column2"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;); &lt;p&gt;dt.AcceptChanges();&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;DataRow&lt;/span&gt;&lt;span style="font-size:85%;"&gt; dr = &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;/span&gt; &lt;p&gt;&lt;span style="font-size:85%;"&gt;//Check if the grid has already some rows&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (gv_Selected.Rows.Count &amp;gt; 0) &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;GridViewRow&lt;/span&gt;&lt;span style="font-size:85%;"&gt; gr &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="font-size:85%;"&gt; gv_Selected.Rows) &lt;p&gt;{&lt;/p&gt; &lt;p&gt;dr = dt.NewRow();&lt;/p&gt; &lt;p&gt;dr[0] = gr.Cells[0].Text;&lt;/p&gt; &lt;p&gt;dr[1] = gr.Cells[1].Text;&lt;/p&gt; &lt;p&gt;dt.Rows.Add(dr);&lt;/p&gt; &lt;p&gt;dt.AcceptChanges();&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (((&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;HtmlInputText&lt;/span&gt;&lt;span style="font-size:85%;"&gt;)gv_row.FindControl(&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"txt_TextBox"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;)).Value.Length != 0) &lt;p&gt;{&lt;/p&gt; &lt;p&gt;dr = dt.NewRow();&lt;/p&gt; &lt;p&gt;dr[0] = gv_row.Cells[0].Text;&lt;/p&gt; &lt;p&gt;dr[1] = ((&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;HtmlInputText&lt;/span&gt;&lt;span style="font-size:85%;"&gt;)gv_row.FindControl(&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"txt_TextBox"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;)).Value; &lt;p&gt;dt.Rows.Add(dr);&lt;/p&gt; &lt;p&gt;dt.AcceptChanges();&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;Label&lt;/span&gt;&lt;span style="font-size:85%;"&gt; lbl_temp = (&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;Label&lt;/span&gt;&lt;span style="font-size:85%;"&gt;)gv_row.FindControl(&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"lbl_Required"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;); &lt;p&gt;lbl_temp.Visible = &lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="font-size:85%;"&gt;; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;Label&lt;/span&gt;&lt;span style="font-size:85%;"&gt; lbl_temp = (&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;Label&lt;/span&gt;&lt;span style="font-size:85%;"&gt;)gv_row.FindControl(&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"lbl_Required"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;); &lt;p&gt;lbl_temp.Visible = &lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="font-size:85%;"&gt;; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;gv_Selected.DataSource = dt;&lt;/p&gt; &lt;p&gt;gv_Selected.DataBind();&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;Grid 2 RowCommand (Delete Row)&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt; &lt;/p&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;protected&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="font-size:85%;"&gt; gv_Selected_RowCommand(&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="font-size:85%;"&gt; sender, &lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;GridViewCommandEventArgs&lt;/span&gt;&lt;span style="font-size:85%;"&gt; e) &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;DataTable&lt;/span&gt;&lt;span style="font-size:85%;"&gt; dt = &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;DataTable&lt;/span&gt;&lt;span style="font-size:85%;"&gt;(&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"Selected"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;); &lt;p&gt;dt.Columns.Add(&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"Column1"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;); &lt;p&gt;dt.Columns.Add(&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"Column2"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;); &lt;p&gt;dt.AcceptChanges();&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;DataRow&lt;/span&gt;&lt;span style="font-size:85%;"&gt; dr = &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="font-size:85%;"&gt;; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (gv_Selected.Rows.Count &amp;gt; 0) &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="font-size:85%;"&gt; i = 0; i &amp;lt; gv_Selected.Rows.Count;i++) &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;GridViewRow&lt;/span&gt;&lt;span style="font-size:85%;"&gt; gr = gv_SelectedTemplates.Rows[i]; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (i.ToString() != e.CommandArgument.ToString()) &lt;p&gt;{&lt;/p&gt; &lt;p&gt;dr = dt.NewRow();&lt;/p&gt; &lt;p&gt;dr[0] = gr.Cells[0].Text;&lt;/p&gt; &lt;p&gt;dr[1] = gr.Cells[1].Text;&lt;/p&gt; &lt;p&gt;dt.Rows.Add(dr);&lt;/p&gt; &lt;p&gt;dt.AcceptChanges();&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;gv_SelectedTemplates.DataSource = dt;&lt;/p&gt; &lt;p&gt;gv_SelectedTemplates.DataBind();&lt;/p&gt; &lt;p&gt;}&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-2979276306190756978?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/2979276306190756978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=2979276306190756978' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/2979276306190756978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/2979276306190756978'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/07/insert-delete-update-row-in-datagrid-at.html' title='Insert / Delete / Update Row in DataGrid at Runtime from Other GridView'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-2177302500968189125</id><published>2008-07-14T19:22:00.001+06:00</published><updated>2008-07-16T12:50:16.363+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GridView Select ALL'/><category scheme='http://www.blogger.com/atom/ns#' term='Select All checkBoxes'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView'/><category scheme='http://www.blogger.com/atom/ns#' term='CheckBoxes'/><title type='text'>GridView (Multiple check Boxes Selection / Get Checked Check Boxes)</title><content type='html'>&lt;div&gt;&lt;strong&gt;&lt;u&gt;Grid View&lt;/u&gt;&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;GridView&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="GridView1"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;AutoGenerateColumns&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="False"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Columns&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;BoundField&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;DataField&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="Column1"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;HeaderText&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="Column"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TemplateField&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;HeaderText&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="TextBox"&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TextBox&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="txt_TextBox"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TextBox&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TemplateField&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TemplateField&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;HeaderText&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="Select"&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;HeaderTemplate&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;Select All&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;input&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="chkAll"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;onclick&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="javascript:SelectAllCheckboxes(this);"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="checkbox"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;HeaderTemplate&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;CheckBox&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="chk_Selected"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;TemplateField&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Columns&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;GridView&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="color:#000000;"&gt;JavaScript&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; &lt;p&gt;&amp;lt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="font-size:85%;color:#000000;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;language&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;="javascript"&amp;gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="font-size:85%;"&gt; SelectAllCheckboxes(spanChk){&lt;/span&gt;&lt;span style="font-size:85%;color:#008000;"&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="font-size:85%;"&gt; oItem = spanChk.children; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="font-size:85%;"&gt; theBox= (spanChk.type==&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"checkbox"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;) ?  &lt;p&gt;spanChk : spanChk.children.item[0];&lt;/p&gt; &lt;p&gt;xState=theBox.checked;&lt;/p&gt; &lt;p&gt;elm=theBox.form.elements;&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="font-size:85%;"&gt;(i=0;i&amp;lt;elm.length;i++) &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="font-size:85%;"&gt;(elm[i].type==&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"checkbox"&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &amp;amp;&amp;amp;  &lt;p&gt;elm[i].id!=theBox.id)&lt;/p&gt; &lt;p&gt;{&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#008000;"&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="font-size:85%;"&gt;(elm[i].checked!=xState) &lt;p&gt;elm[i].click();&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#008000;"&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;}&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; &lt;p&gt;&amp;lt;/&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="color:#000000;"&gt;Code Behind&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#008000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;string &lt;span style="color:#0000ff;"&gt;str_Result = "";&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#008000;"&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="font-size:85%;"&gt; i = 0; i &amp;lt; gv_SearchedDocuments.Rows.Count; i++) &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;GridViewRow&lt;/span&gt;&lt;span style="font-size:85%;"&gt; gv_row = GridView1.Rows[i]; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;bool&lt;/span&gt;&lt;span style="font-size:85%;"&gt; isChecked = ((&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;CheckBox&lt;/span&gt;&lt;span style="font-size:85%;"&gt;)gv_row.FindControl(&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"chk_Selected"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;)).Checked; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (isChecked) &lt;p&gt;{&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;str_Result += GridView1.Rows[i].Cells[0].Text;&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;TextBox&lt;/span&gt;&lt;span style="font-size:85%;"&gt; txt_Temp = ((&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;TextBox&lt;/span&gt;&lt;span style="font-size:85%;"&gt;)gv_row.FindControl(&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"txt_ViewOrder"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;)); &lt;p&gt;str_Result += &lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;txt_Temp.Text+"&amp;lt;,br/&amp;gt;"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;}&lt;/p&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#008000;"&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;lbl_Message.Text = str_Result ;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-2177302500968189125?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/2177302500968189125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=2177302500968189125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/2177302500968189125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/2177302500968189125'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/07/gridview-multiple-check-boxes-selection.html' title='GridView (Multiple check Boxes Selection / Get Checked Check Boxes)'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-8262043515431801729</id><published>2008-07-08T12:33:00.001+06:00</published><updated>2008-07-08T14:09:24.494+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Event Logger'/><category scheme='http://www.blogger.com/atom/ns#' term='Event Logs'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom Exceptions'/><category scheme='http://www.blogger.com/atom/ns#' term='Exception Logger'/><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><category scheme='http://www.blogger.com/atom/ns#' term='Exception'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Exception Handling (Exception logging)</title><content type='html'>using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;&lt;br /&gt;namespace ExceptionLogger&lt;br /&gt;{&lt;br /&gt;    public class ExceptionLogger&lt;br /&gt;    {&lt;br /&gt;        public static void WritetoCustomEventLog(Exception paramEntry, EventLogEntryType paramType)&lt;br /&gt;        {&lt;br /&gt;            string str_Source = "ERROR LOG"; //Source Name&lt;br /&gt;            string str_LogType = "My Test LOG"; //Your log Name if it does not exists then first it will create and then add entry&lt;br /&gt;            string str_Machine = "."; //machine name&lt;br /&gt;&lt;br /&gt;            if (!System.Diagnostics.EventLog.SourceExists(str_Source, str_Machine))&lt;br /&gt;            {&lt;br /&gt;                System.Diagnostics.EventLog.CreateEventSource(str_Source, str_LogType, str_Machine);&lt;br /&gt;            }&lt;br /&gt;            string ExceptionDetail = "";&lt;br /&gt;            ExceptionDetail = "Message : " + paramEntry.Message + "\n";&lt;br /&gt;            ExceptionDetail += "Stack Trace : " + paramEntry.StackTrace + "\n";&lt;br /&gt;            ExceptionDetail += "Source : " + paramEntry.Source + "\n";&lt;br /&gt;            ExceptionDetail += "Target Site:" + paramEntry.TargetSite + "\n";&lt;br /&gt;            ExceptionDetail += "Inner Exception:" + paramEntry.InnerException + "\n";&lt;br /&gt;            ExceptionDetail += "Help Link:" + paramEntry.HelpLink + "\n";&lt;br /&gt;            EventLog CustomLog = new EventLog(str_LogType, str_Machine, str_Source);&lt;br /&gt;&lt;br /&gt;            CustomLog.WriteEntry(ExceptionDetail, paramType);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-8262043515431801729?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/8262043515431801729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=8262043515431801729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/8262043515431801729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/8262043515431801729'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/07/exception-handling-exception-logging.html' title='Exception Handling (Exception logging)'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-5802206211957112875</id><published>2008-07-07T21:43:00.001+06:00</published><updated>2008-07-08T14:10:55.160+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Master Pages'/><category scheme='http://www.blogger.com/atom/ns#' term='Properties'/><category scheme='http://www.blogger.com/atom/ns#' term='contentpage'/><category scheme='http://www.blogger.com/atom/ns#' term='Access Master Page'/><category scheme='http://www.blogger.com/atom/ns#' term='content page'/><category scheme='http://www.blogger.com/atom/ns#' term='Master Page Labels'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='Master Page Properties'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Access Master Pages Properties</title><content type='html'>There are different techniques to access MasterPages properties&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Master Page&lt;br /&gt;&lt;/b&gt;&lt;/u&gt;Code file:&lt;br /&gt;&lt;br /&gt;public partial class MyMasterPageClass: System.Web.UI.MasterPage&lt;br /&gt;{&lt;br /&gt;   public string ErrorMessage&lt;br /&gt;    {&lt;br /&gt;        set&lt;br /&gt;        {&lt;br /&gt;            lblErrorPane.Text = value;&lt;br /&gt;            panelErrorMessage.Visible = true;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Content Page&lt;br /&gt;&lt;/b&gt;&lt;/u&gt;&lt;p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;1) ((&lt;/span&gt;MyMasterPageClass&lt;span style="font-size:85%;"&gt;)Master).ErrorMessage = " Test Error Message";&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;After adding this &lt;/span&gt;&amp;lt;%@ MasterType VirtualPath="~/MasterPage.master" %&amp;gt; &lt;span style="font-size:85%;"&gt;under Page Directive you can access the property of master page directly.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:85%;"&gt;2) this.Master.ErrorMessage = "Test Message";&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-5802206211957112875?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/5802206211957112875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=5802206211957112875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5802206211957112875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/5802206211957112875'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/07/access-master-pages-properties.html' title='Access Master Pages Properties'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-7627850206876730347</id><published>2008-07-04T00:38:00.001+06:00</published><updated>2008-07-08T14:13:00.224+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unique'/><category scheme='http://www.blogger.com/atom/ns#' term='unique string generator'/><category scheme='http://www.blogger.com/atom/ns#' term='Alpha numeric unique'/><category scheme='http://www.blogger.com/atom/ns#' term='Password generator'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='Random'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='random number generator'/><title type='text'>Unique String Generator</title><content type='html'>using System;&lt;br /&gt;using System.Security.Cryptography;&lt;br /&gt;&lt;br /&gt;public class UniqueStringGenerator&lt;br /&gt;{&lt;br /&gt;   private static int DEFAULT_MIN_STRING_LENGTH = 20;&lt;br /&gt;   private static int DEFAULT_MAX_STRING_LENGTH = 20;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   private static string STRING_CHARS_LCASE = "abcdefgijkmnopqrstwxyz";&lt;br /&gt;   private static string STRING_CHARS_UCASE = "ABCDEFGHJKLMNPQRSTWXYZ";&lt;br /&gt;   private static string STRING_CHARS_NUMERIC = "23456789";&lt;br /&gt;   private static string STRING_CHARS_SPECIAL = "*$-+?_&amp;amp;=!%{}/";&lt;br /&gt;&lt;br /&gt;   public static string Generate()&lt;br /&gt;   {&lt;br /&gt;       return Generate(DEFAULT_MIN_STRING_LENGTH,&lt;br /&gt;                       DEFAULT_MAX_STRING_LENGTH);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static string Generate(int length)&lt;br /&gt;   {&lt;br /&gt;       return Generate(length, length);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static string GenerateWithSpecialCharacters()&lt;br /&gt;   {&lt;br /&gt;       return GenerateWithSpecialCharacters(DEFAULT_MIN_STRING_LENGTH,&lt;br /&gt;                       DEFAULT_MAX_STRING_LENGTH);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static string GenerateWithSpecialCharacters(int length)&lt;br /&gt;   {&lt;br /&gt;       return GenerateWithSpecialCharacters(length, length);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static string GenerateWithSpecialCharacters(int minLength,&lt;br /&gt;                             int maxLength)&lt;br /&gt;   {&lt;br /&gt;&lt;br /&gt;       if (minLength &amp;lt;= 0 || maxLength &amp;lt;= 0 || minLength &amp;gt; maxLength)&lt;br /&gt;           return null;&lt;br /&gt;&lt;br /&gt;       char[][] charGroups = new char[][]&lt;br /&gt;       {&lt;br /&gt;           STRING_CHARS_LCASE.ToCharArray(),&lt;br /&gt;           STRING_CHARS_UCASE.ToCharArray(),&lt;br /&gt;           STRING_CHARS_NUMERIC.ToCharArray(),&lt;br /&gt;           STRING_CHARS_SPECIAL.ToCharArray()&lt;br /&gt;       };&lt;br /&gt;&lt;br /&gt;       int[] charsLeftInGroup = new int[charGroups.Length];&lt;br /&gt;&lt;br /&gt;       for (int i = 0; i &amp;lt; charsLeftInGroup.Length; i++)&lt;br /&gt;           charsLeftInGroup[i] = charGroups[i].Length;&lt;br /&gt;&lt;br /&gt;       int[] leftGroupsOrder = new int[charGroups.Length];&lt;br /&gt;&lt;br /&gt;       for (int i = 0; i &amp;lt; leftGroupsOrder.Length; i++)&lt;br /&gt;           leftGroupsOrder[i] = i;&lt;br /&gt;&lt;br /&gt;       byte[] randomBytes = new byte[4];&lt;br /&gt;&lt;br /&gt;       RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();&lt;br /&gt;       rng.GetBytes(randomBytes);&lt;br /&gt;&lt;br /&gt;       int seed = (randomBytes[0] &amp;amp; 0x7f) &amp;lt;&amp;lt; 24 |&lt;br /&gt;                   randomBytes[1] &amp;lt;&amp;lt; 16 |&lt;br /&gt;                   randomBytes[2] &amp;lt;&amp;lt; 8 |&lt;br /&gt;                   randomBytes[3];&lt;br /&gt;&lt;br /&gt;       Random random = new Random(seed);&lt;br /&gt;&lt;br /&gt;       char[] UniqueString = null;&lt;br /&gt;&lt;br /&gt;       if (minLength &amp;lt; maxLength)&lt;br /&gt;           UniqueString = new char[random.Next(minLength, maxLength + 1)];&lt;br /&gt;       else&lt;br /&gt;           UniqueString = new char[minLength];&lt;br /&gt;&lt;br /&gt;       int nextCharIdx;&lt;br /&gt;&lt;br /&gt;       int nextGroupIdx;&lt;br /&gt;&lt;br /&gt;       int nextLeftGroupsOrderIdx;&lt;br /&gt;&lt;br /&gt;       int lastCharIdx;&lt;br /&gt;&lt;br /&gt;       int lastLeftGroupsOrderIdx = leftGroupsOrder.Length - 1;&lt;br /&gt;&lt;br /&gt;       for (int i = 0; i &amp;lt; UniqueString.Length; i++)&lt;br /&gt;       {&lt;br /&gt;&lt;br /&gt;           if (lastLeftGroupsOrderIdx == 0)&lt;br /&gt;               nextLeftGroupsOrderIdx = 0;&lt;br /&gt;           else&lt;br /&gt;               nextLeftGroupsOrderIdx = random.Next(0,&lt;br /&gt;                                                    lastLeftGroupsOrderIdx);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           nextGroupIdx = leftGroupsOrder[nextLeftGroupsOrderIdx];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           lastCharIdx = charsLeftInGroup[nextGroupIdx] - 1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           if (lastCharIdx == 0)&lt;br /&gt;               nextCharIdx = 0;&lt;br /&gt;           else&lt;br /&gt;               nextCharIdx = random.Next(0, lastCharIdx + 1);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           UniqueString[i] = charGroups[nextGroupIdx][nextCharIdx];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           if (lastCharIdx == 0)&lt;br /&gt;               charsLeftInGroup[nextGroupIdx] =&lt;br /&gt;                                         charGroups[nextGroupIdx].Length;&lt;br /&gt;&lt;br /&gt;           else&lt;br /&gt;           {&lt;br /&gt;&lt;br /&gt;               if (lastCharIdx != nextCharIdx)&lt;br /&gt;               {&lt;br /&gt;                   char temp = charGroups[nextGroupIdx][lastCharIdx];&lt;br /&gt;                   charGroups[nextGroupIdx][lastCharIdx] =&lt;br /&gt;                               charGroups[nextGroupIdx][nextCharIdx];&lt;br /&gt;                   charGroups[nextGroupIdx][nextCharIdx] = temp;&lt;br /&gt;               }&lt;br /&gt;&lt;br /&gt;               charsLeftInGroup[nextGroupIdx]--;&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;           if (lastLeftGroupsOrderIdx == 0)&lt;br /&gt;               lastLeftGroupsOrderIdx = leftGroupsOrder.Length - 1;&lt;br /&gt;&lt;br /&gt;           else&lt;br /&gt;           {&lt;br /&gt;&lt;br /&gt;               if (lastLeftGroupsOrderIdx != nextLeftGroupsOrderIdx)&lt;br /&gt;               {&lt;br /&gt;                   int temp = leftGroupsOrder[lastLeftGroupsOrderIdx];&lt;br /&gt;                   leftGroupsOrder[lastLeftGroupsOrderIdx] =&lt;br /&gt;                               leftGroupsOrder[nextLeftGroupsOrderIdx];&lt;br /&gt;                   leftGroupsOrder[nextLeftGroupsOrderIdx] = temp;&lt;br /&gt;               }&lt;br /&gt;               lastLeftGroupsOrderIdx--;&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       return new string(UniqueString);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static string Generate(int minLength,&lt;br /&gt;                                 int maxLength)&lt;br /&gt;   {&lt;br /&gt;&lt;br /&gt;       if (minLength &amp;lt;= 0 || maxLength &amp;lt;= 0 || minLength &amp;gt; maxLength)&lt;br /&gt;           return null;&lt;br /&gt;&lt;br /&gt;       char[][] charGroups = new char[][]&lt;br /&gt;       {&lt;br /&gt;           STRING_CHARS_LCASE.ToCharArray(),&lt;br /&gt;           STRING_CHARS_UCASE.ToCharArray(),&lt;br /&gt;           STRING_CHARS_NUMERIC.ToCharArray(),&lt;br /&gt;       };&lt;br /&gt;&lt;br /&gt;       int[] charsLeftInGroup = new int[charGroups.Length];&lt;br /&gt;&lt;br /&gt;       for (int i = 0; i &amp;lt; charsLeftInGroup.Length; i++)&lt;br /&gt;           charsLeftInGroup[i] = charGroups[i].Length;&lt;br /&gt;&lt;br /&gt;       int[] leftGroupsOrder = new int[charGroups.Length];&lt;br /&gt;&lt;br /&gt;       for (int i = 0; i &amp;lt; leftGroupsOrder.Length; i++)&lt;br /&gt;           leftGroupsOrder[i] = i;&lt;br /&gt;&lt;br /&gt;       byte[] randomBytes = new byte[4];&lt;br /&gt;&lt;br /&gt;       RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();&lt;br /&gt;       rng.GetBytes(randomBytes);&lt;br /&gt;&lt;br /&gt;       int seed = (randomBytes[0] &amp;amp; 0x7f) &amp;lt;&amp;lt; 24 |&lt;br /&gt;                   randomBytes[1] &amp;lt;&amp;lt; 16 |&lt;br /&gt;                   randomBytes[2] &amp;lt;&amp;lt; 8 |&lt;br /&gt;                   randomBytes[3];&lt;br /&gt;&lt;br /&gt;       Random random = new Random(seed);&lt;br /&gt;&lt;br /&gt;       char[] UniqueString = null;&lt;br /&gt;&lt;br /&gt;       if (minLength &amp;lt; maxLength)&lt;br /&gt;           UniqueString = new char[random.Next(minLength, maxLength + 1)];&lt;br /&gt;       else&lt;br /&gt;           UniqueString = new char[minLength];&lt;br /&gt;&lt;br /&gt;       int nextCharIdx;&lt;br /&gt;&lt;br /&gt;       int nextGroupIdx;&lt;br /&gt;&lt;br /&gt;       int nextLeftGroupsOrderIdx;&lt;br /&gt;&lt;br /&gt;       int lastCharIdx;&lt;br /&gt;&lt;br /&gt;       int lastLeftGroupsOrderIdx = leftGroupsOrder.Length - 1;&lt;br /&gt;&lt;br /&gt;       for (int i = 0; i &amp;lt; UniqueString.Length; i++)&lt;br /&gt;       {&lt;br /&gt;&lt;br /&gt;           if (lastLeftGroupsOrderIdx == 0)&lt;br /&gt;               nextLeftGroupsOrderIdx = 0;&lt;br /&gt;           else&lt;br /&gt;               nextLeftGroupsOrderIdx = random.Next(0,&lt;br /&gt;                                                    lastLeftGroupsOrderIdx);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           nextGroupIdx = leftGroupsOrder[nextLeftGroupsOrderIdx];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           lastCharIdx = charsLeftInGroup[nextGroupIdx] - 1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           if (lastCharIdx == 0)&lt;br /&gt;               nextCharIdx = 0;&lt;br /&gt;           else&lt;br /&gt;               nextCharIdx = random.Next(0, lastCharIdx + 1);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           UniqueString[i] = charGroups[nextGroupIdx][nextCharIdx];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           if (lastCharIdx == 0)&lt;br /&gt;               charsLeftInGroup[nextGroupIdx] =&lt;br /&gt;                                         charGroups[nextGroupIdx].Length;&lt;br /&gt;&lt;br /&gt;           else&lt;br /&gt;           {&lt;br /&gt;&lt;br /&gt;               if (lastCharIdx != nextCharIdx)&lt;br /&gt;               {&lt;br /&gt;                   char temp = charGroups[nextGroupIdx][lastCharIdx];&lt;br /&gt;                   charGroups[nextGroupIdx][lastCharIdx] =&lt;br /&gt;                               charGroups[nextGroupIdx][nextCharIdx];&lt;br /&gt;                   charGroups[nextGroupIdx][nextCharIdx] = temp;&lt;br /&gt;               }&lt;br /&gt;&lt;br /&gt;               charsLeftInGroup[nextGroupIdx]--;&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;           if (lastLeftGroupsOrderIdx == 0)&lt;br /&gt;               lastLeftGroupsOrderIdx = leftGroupsOrder.Length - 1;&lt;br /&gt;&lt;br /&gt;           else&lt;br /&gt;           {&lt;br /&gt;&lt;br /&gt;               if (lastLeftGroupsOrderIdx != nextLeftGroupsOrderIdx)&lt;br /&gt;               {&lt;br /&gt;                   int temp = leftGroupsOrder[lastLeftGroupsOrderIdx];&lt;br /&gt;                   leftGroupsOrder[lastLeftGroupsOrderIdx] =&lt;br /&gt;                               leftGroupsOrder[nextLeftGroupsOrderIdx];&lt;br /&gt;                   leftGroupsOrder[nextLeftGroupsOrderIdx] = temp;&lt;br /&gt;               }&lt;br /&gt;               lastLeftGroupsOrderIdx--;&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       return new string(UniqueString);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There are two functions&lt;br /&gt;&lt;br /&gt;   * Generate&lt;br /&gt;         o This function returns the string with no special characters&lt;br /&gt;   * GenerateWithSpecialCharacters&lt;br /&gt;         o This function returns the string with special characters included&lt;br /&gt;   * Example Code&lt;br /&gt;         o string temp = UniqueStringGenerator.GenerateWithSpecialCharacters(20,20);&lt;br /&gt;         o string temp = UniqueStringGenerator.GenerateWithSpecialCharacters(20);&lt;br /&gt;         o string temp = UniqueStringGenerator.GenerateWithSpecialCharacters();&lt;br /&gt;         o .......................&lt;br /&gt;         o string temp = UniqueStringGenerator.Generate(20,20);&lt;br /&gt;         o string temp = UniqueStringGenerator.Generate(20);&lt;br /&gt;         o string temp = UniqueStringGenerator.Generate();&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-7627850206876730347?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/7627850206876730347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=7627850206876730347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/7627850206876730347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/7627850206876730347'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/07/unique-string-generator.html' title='Unique String Generator'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-3109136969674876939</id><published>2008-04-02T21:02:00.000+05:00</published><updated>2008-04-02T21:03:35.666+05:00</updated><title type='text'>Spider</title><content type='html'>Download Spider&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-3109136969674876939?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/3109136969674876939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=3109136969674876939' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/3109136969674876939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/3109136969674876939'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/04/spider.html' title='Spider'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-9174318860830961126</id><published>2008-03-24T19:08:00.001+05:00</published><updated>2008-03-24T19:08:43.596+05:00</updated><title type='text'>ASP.Net Localization</title><content type='html'>To use resources first create Resource files for a page, to generate resources to go Tools - &amp;gt; Generate Local Resources.&lt;br&gt;A resource file for that page will be generated in App_LocalResources Folder, for example if i have generated a file against Default.aspx then a resource file will be generated in App_LocalResources with the name Default.aspx.resx, this will be the default resource file having mapping of all the controls texts in the resource. Now Create other resource file with the value in other language against same keys. eg i want to use arabic and i created a file with the name Default.aspx.ar-EG.resx. now to use this resource file i just have to override InitalizeCulture method and have to set the culture value the code is given below.&lt;br&gt; &lt;br&gt;To set the culture and UI culture for an &lt;a href="http://ASP.NET"&gt;ASP.NET&lt;/a&gt; Web page programmatically&lt;br&gt;&lt;br&gt; &amp;nbsp; 1. Override the InitializeCulture method for the page.&lt;br&gt; &amp;nbsp; 2. In the overridden method, determine which language and culture to set the page to. &lt;br&gt;  &amp;nbsp; 3. Set the UI culture and culture in one of the following ways:&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Set the Culture and UICulture properties of the page to the language and culture string (for example, en-US). These properties are internal to the page, and can only be used in a page.&lt;/li&gt; &lt;li&gt;Set the CurrentUICulture and CurrentCulture properties of the current thread to the UI culture and culture, respectively. The CurrentUICulture property takes a language and culture information string. To set the CurrentCulture property, you create an instance of the CultureInfo class and call its CreateSpecificCulture method.&lt;/li&gt; &lt;/ul&gt;Following is the code to override InitializeCulture.&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;span style="color: rgb(51, 102, 255);"&gt;protected override void&lt;/span&gt; InitializeCulture()&lt;br&gt;&amp;nbsp;{&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(51, 102, 255);"&gt;if &lt;/span&gt;(Session[&amp;quot;UICulture&amp;quot;] != null)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(51, 102, 255);"&gt;if &lt;/span&gt;(Session[&amp;quot;UICulture&amp;quot;].ToString() == &amp;quot;ar-EG&amp;quot;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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; Thread.CurrentThread.CurrentUICulture = &lt;span style="color: rgb(51, 102, 255);"&gt;new &lt;/span&gt;CultureInfo(Session[&amp;quot;UICulture&amp;quot;].ToString());&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; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Session[&amp;quot;UICulture&amp;quot;].ToString());&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;}&lt;br&gt;&lt;br&gt;&lt;br&gt;Add Following code to your Event ( Language select from dropdownlist or button )&lt;br&gt; &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(51, 102, 255);"&gt;protected void&lt;/span&gt; Button2_Click(object sender, EventArgs e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Session[&amp;quot;UICulture&amp;quot;] = &amp;quot;ar-EG&amp;quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SelectedLanguage.Value = &amp;quot;ar-EG&amp;quot;;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(51, 204, 0);"&gt; //Force re-initialization of the page to fire InitializeCulture()&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect(Request.Url.LocalPath);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-9174318860830961126?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/9174318860830961126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=9174318860830961126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/9174318860830961126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/9174318860830961126'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/03/aspnet-localization.html' title='ASP.Net Localization'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-1266828794460918201</id><published>2008-02-22T17:17:00.000+05:00</published><updated>2010-05-04T17:18:30.504+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='You tube'/><title type='text'>YouTube Blocked in Pakistan. Why?</title><content type='html'>It seems that YouTube is down in Pakistan. Possibly it is blocked.&lt;br /&gt;&lt;br /&gt;Blocking websites is a rather bad habit that the government authorities in Pakistan have gotten into (here and here). This is something that we have written about before. It is silly habit, because technologically it does not work. But, much more importantly, it is a disturbing habit because it points towards a desire by those in authority to “control” the passions of the public. Democracy demands the very opposite - that the people control teh passions of those in power.&lt;br /&gt;&lt;br /&gt;But the real question is, that if YouTube is blocked, then why?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1272246033894754683-1266828794460918201?l=rizwanshah.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rizwanshah.blogspot.com/feeds/1266828794460918201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1272246033894754683&amp;postID=1266828794460918201' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/1266828794460918201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1272246033894754683/posts/default/1266828794460918201'/><link rel='alternate' type='text/html' href='http://rizwanshah.blogspot.com/2008/02/youtube-blocked-in-pakistan-why.html' title='YouTube Blocked in Pakistan. Why?'/><author><name>Rizwan Shah</name><uri>http://www.blogger.com/profile/17110740021242516189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_Qi0BBZfnzVg/RwskLqwNYlI/AAAAAAAAABg/Rg4uShElosA/s320/riz.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1272246033894754683.post-7180832008092687041</id><published>2007-12-31T21:17:00.001+05:00</published><updated>2007-12-31T21:17:19.871+05:00</updated><title type='text'>Service Oriented Architecture</title><content type='html'>&lt;p&gt; &lt;table class="multicol"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td class="innercol" valign="top"&gt; &lt;h1&gt;&amp;nbsp;&lt;/h1&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;The goal for a SOA is a world wide mesh of collaborating services, which are published and available for invocation on the Service Bus. Adopting SOA is essential to deliver the business agility and IT flexibility promised by Web Services. These benefits are delivered not by just viewing service architecture from a technology perspective and the adoption of Web Service protocols, but require the creation of a Service Oriented Environment that is based on the following key principals: &lt;/font&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;font color="#000000" size="2"&gt;Service is the important concept. Web Services are the set of protocols by which Services can be published, discovered and used in a technology neutral, standard form. &lt;/font&gt; &lt;li&gt;&lt;font color="#000000" size="2"&gt;SOA is not just an architecture of services seen from a technology perspective, but the policies, practices, and frameworks by which we ensure the &lt;em&gt;right&lt;/em&gt; services are provided and consumed.  &lt;/font&gt; &lt;li&gt;&lt;font color="#000000" size="2"&gt;With SOA it is critical to implement processes that ensure that there are at least two different and separate processes—for provider and consumer. &lt;/font&gt; &lt;li&gt;&lt;font color="#000000" size="2"&gt;Rather than leaving developers to discover individual services and put them into context, the Business Service Bus is instead their starting point that guides them to a coherent set that has been assembled for their domain. &lt;/font&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p style="MARGIN-TOP: 0px"&gt;&lt;font color="#000000" size="2"&gt;A service-oriented architecture is essentially a collection of services. These services communicate with each other. The communication can involve either simple data passing or it could involve two or more services coordinating some activity. Some means of connecting services to each other is needed. &lt;/font&gt;&lt;/p&gt; &lt;div style="MARGIN-TOP: 0px"&gt;&lt;font color="#000000" size="2"&gt;Service-oriented architectures are not a new thing. The first service-oriented architecture for many people in the past was with the use DCOM or Object Request Brokers (ORBs) based on the CORBA specification. For more on DCOM and CORBA. &lt;/font&gt;&lt;/div&gt; &lt;div style="MARGIN-TOP: 0px"&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/div&gt; &lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt; &lt;div style="MARGIN-TOP: 0px"&gt;&lt;strong&gt;&lt;font size="2"&gt;DCOM&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt; &lt;div style="MARGIN-TOP: 0px"&gt; &lt;p style="MARGIN-TOP: 0px"&gt;&lt;font size="2"&gt;DCOM is the acronym for the Distributed Component Object Model, an extension of the Component Object Model (COM). DCOM was introduced in 1996 and is designed for use across multiple network transports, including Internet protocols such as HTTP. DCOM is based on the Open Software Foundation&amp;#39;s DCE-RPC spec and will work with both Java applets and ActiveX components through its use of the Component Object Model (COM). It works primarily with Microsoft Windows. &lt;/font&gt;&lt;/p&gt;&lt;/div&gt; &lt;div dir="ltr" style="MARGIN-TOP: 0px"&gt;&lt;strong&gt;&lt;font size="2"&gt;CORBA&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt; &lt;div dir="ltr" style="MARGIN-TOP: 0px"&gt;&lt;font size="2"&gt;&lt;/font&gt; &lt;p style="MARGIN-TOP: 0px"&gt;&lt;font size="2"&gt;CORBA is the acronym for Common Object Request Broker Architecture. It was developed under the auspices of the Object Management Group (OMG). It is middleware. A CORBA-based program from any vendor, on almost any computer, operating system, programming language, and network, can interoperate with a CORBA-based program from the same or another vendor, on almost any other computer, operating system, programming language, and network. &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;The first service-oriented architecture for many people in the past was with the use of Object Request Brokers (ORBs) based on the CORBA specification. The CORBA specification is responsible for really increasing the awareness of service-oriented architectures.&amp;nbsp; &lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt; &lt;h2&gt;&lt;font face="arial, Arial, Helvetica"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;Services&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/h2&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;If a service-oriented architecture is to be effective, we need a clear understanding of the term service. A service is a function that is well-defined, self-contained, and does not depend on the context or state of other services. &lt;/font&gt;&lt;/p&gt; &lt;h2&gt;&lt;font face="arial, Arial, Helvetica"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;Connections&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/h2&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;The technology of&amp;nbsp;WebService &lt;/font&gt;&lt;font color="#000000" size="2"&gt;is the most likely connection technology of service-oriented architectures. Web services essentially use XML &lt;/font&gt;&lt;font color="#000000" size="2"&gt; to create a robust connection.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;The following figure illustrates a basic service-oriented architecture. It shows a service consumer at the right sending a service request message to a service provider at the left. The service provider returns a response message to the service consumer. The request and subsequent response connections are defined in some way that is understandable to both the service consumer and service provider.  &lt;/font&gt;&lt;font color="#000000" size="2"&gt;A service provider can also be a service consumer.&amp;nbsp;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;&lt;img height="106" alt="Service-oriented architecture" src="http://www.service-architecture.com/images/web_services/service-oriented_architecture_basics.jpg" width="528" border="0"&gt;&lt;/font&gt; &lt;/p&gt; &lt;div id="soa"&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;IT departments are managing increasingly complex IT portfolios. Yet as business needs change, these departments must still ensure that their technologies remain aligned with business goals. Failure to do so compromises organizational agility.  &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;The problem for IT departments is typically not insufficient functionality; rather, it is that critical business systems such as customer relationship management (CRM) and enterprise resource planning (ERP) operate in isolation from other critical business systems—despite the fact that business processes often span multiple applications. To obtain an end-to-end view of a complex business process necessitates integration of information and process silos. In the past, this has been accomplished either though time-consuming manual interventions, or through hard-coded solutions that are difficult to maintain.  &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;Service orientation is an approach to organizing distributed IT resources into an integrated solution that breaks down information silos and maximizes business agility. Service orientation modularizes IT resources, creating loosely coupled business processes that integrate information across business systems. Critical to a well-designed service-oriented architecture is producing business process solutions that are relatively free from the constraints of the underlying IT infrastructure, because this enables the greater agility that businesses are seeking.  &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;Service Oriented Architecture (SOA) ultimately enables the delivery of a new generation of dynamic applications (sometimes called composite applications). These applications provide end users with more accurate and comprehensive information and insight into processes, as well as the flexibility to access it in the most suitable form and presentation factor, whether through the Web or through a rich client or mobile device. Dynamic applications are what enable businesses to improve and automate manual tasks, to realize a consistent view of customers and partner relations, and to orchestrate business processes that comply with internal mandates and external regulations. The net result is that these businesses are able to gain the agility necessary for superior marketplace performance.  &lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;a name="EFB"&gt;&lt;/a&gt; &lt;h2&gt;&lt;font color="#000000" size="2"&gt;SOA defined&lt;/font&gt;&lt;/h2&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;Service orientation is a means for integrating across diverse systems. Each IT resource, whether an application, system, or trading partner, can be accessed as a service. These capabilities are available through interfaces; complexity arises when service providers differ in their operating system or communication protocols, resulting in inoperability.  &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;Service orientation uses standard protocols and conventional interfaces—usually Web services—to facilitate access to business logic and information among diverse services. Specifically, SOA allows the underlying service capabilities and interfaces to be composed into processes. Each process is itself a service, one that now offers up a new, aggregated capability. Because each new process is exposed through a standardized interface, the underlying implementation of the individual service providers is free to change without impacting how the service is consumed.  &lt;/font&gt;&lt;/p&gt;&lt;a name="EJB"&gt;&lt;/a&gt; &lt;h2&gt;&lt;font color="#000000" size="2"&gt;Why SOA?&lt;/font&gt;&lt;/h2&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;Complex, distributed IT resources are a concern for businesses. Too frequently, the existing IT portfolio does not adequately meet specific business needs, is costly to manage and maintain, and is inflexible in the face of business growth and change. The solution, however, is not to rip and replace systems or applications, nor to completely renovate them, but rather to find a way to leverage existing IT investments so that overall organizational goals are effectively supported.  &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;Service orientation helps to accomplish these goals by making systems more responsive to business needs, simpler to develop, and easier to maintain and manage. Implementing a solution architecture based upon service orientation helps organizations plan ahead for change, rather than responding reactively. &lt;/font&gt;&lt;/p&gt;&lt;a name="ENB"&gt;&lt;/a&gt; &lt;h2&gt;&lt;font color="#000000" size="2"&gt;Who does SOA?&lt;/font&gt;&lt;/h2&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;Strictly speaking, SOA is done by developers and solution architects. However, stakeholders in a service-oriented solution span a range of roles, and it is critical that their interests not only be taken into account but that they actively drive the design of the SOA solution.  &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;Starting with those interests, the business analyst is concerned with bringing IT investments more in line with the business strategy. For the developer, this means that the SOA solution must map the sources of business information—systems, staff, trading partners—into a unified and comprehensive view such that the business analyst has greater insight into the costs and benefits of various investments.  &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;The chief technology officer (CTO) of the organization will work with developers to ensure that when designing a solution to meet the needs of the business analyst, the integrity of existing IT systems and applications resources are preserved, even as new capabilities are developed.  &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;And the IT manager, concerned with effectively integrating distributed systems such that management is simplified, will work with the developer to ensure that these goals are also met. &lt;/font&gt; &lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;Ultimately, the developers and solution architects are concerned with creating dynamic collaborative applications that meet the goals of the various stakeholders. The service orientation approach enables them to do so in a way that meets the needs of the organization as a whole.  &lt;/font&gt;&lt;/p&gt;&lt;a name="EUB"&gt;&lt;/a&gt; &lt;h2&gt;&lt;font color="#000000" size="2"&gt;What SOA isn't&lt;/font&gt;&lt;/h2&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;There are numerous misconceptions about what SOA is—that it is a product that can be purchased (it is not; it is a design philosophy that informs how the solution should be built); that the goal is to build a SOA (it is not; SOA is a means to an end); or that SOA requires a complete technological and business process overhaul (it doesn't; SOA solutions should be incremental and built on current investments). &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;SOA is also often equated with Web services, and the terms used interchangeably. While it is true that SOA is made easier and more pervasive through the broad adoption of Web services–based standards and protocols, the two are distinct. SOA is an approach to designing systems—in effect the architectural drawings or blueprint—that directs how IT resources will be integrated and which services will be exposed for use. In contrast, Web services is an implementation methodology that uses specific standards and language protocols to execute on a SOA solution.  &lt;/font&gt;&lt;/p&gt;&lt;a name="EZB"&gt;&lt;/a&gt; &lt;h2&gt;&lt;font color="#000000" size="2"&gt;Before starting a SOA&lt;/font&gt;&lt;/h2&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;Before a developer writes a single line of code, it is critical to identify both specific business drivers of the SOA endeavor and the dependencies between the business and the underlying technologies. Neglecting the business context can result in a project in which SOA infrastructure is pursued for its own sake, or where investments are made that do not line up well with the needs and priorities of the business. &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;Two approaches are commonly pursued for implementing SOA: top-down and bottom-up. Both approaches have possible pitfalls that can prevent success. Many organizations that have attempted to roll out SOA infrastructure through a top-down approach have discovered that when the infrastructure is finally delivered it is out of sync with the needs of the business. Likewise, a bottom-up approach can fail as well, because it can lead to a chaotic implementation of services created without regard to organizational goals.  &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000" size="2"&gt;The "middle-out" approach is a successful hybrid of the two other approaches. Business drivers and strategic vision are first employed to set clear directio
