Search Results

Search found 26693 results on 1068 pages for 'back to basics'.

Page 490/1068 | < Previous Page | 486 487 488 489 490 491 492 493 494 495 496 497  | Next Page >

  • SQL SERVER – T-SQL Scripts to Find Maximum between Two Numbers

    - by pinaldave
    There are plenty of the things life one can make it simple. I really believe in the same. I was yesterday traveling for community related activity. On airport while returning I met a SQL Enthusiast. He asked me if there is any simple way to find maximum between two numbers in the SQL Server. I asked him back that what he really mean by Simple Way and requested him to demonstrate his code for finding maximum between two numbers. Here is his code: DECLARE @Value1 DECIMAL(5,2) = 9.22 DECLARE @Value2 DECIMAL(5,2) = 8.34 SELECT (0.5 * ((@Value1 + @Value2) + ABS(@Value1 - @Value2))) AS MaxColumn GO I thought his logic was accurate but the same script can be written another way. I quickly wrote following code for him and which worked just fine for him. Here is my code: DECLARE @Value1 DECIMAL(5,2) = 9.22 DECLARE @Value2 DECIMAL(5,2) = 8.34 SELECT CASE WHEN @Value1 > @Value2 THEN @Value1 ELSE @Value2 END AS MaxColumn GO He agreed that my code is much simpler but as per him there is some problem with my code which apparently he does not remember at this time. There are cases when his code will give accurate values and my code will not. I think his comment has value but both of us for the moment could not come up with any valid reason. Do you think any scenario where his code will work and my suggested code will not work? Reference: Pinal Dave (http://blog.SQLAuthority.com) Filed under: Pinal Dave, PostADay, SQL, SQL Authority, SQL Query, SQL Scripts, SQL Server, SQL Tips and Tricks, T SQL, Technology

    Read the article

  • Change in Job Title and Responsibilities

    - by John Conwell
    I've spent the past 7 years focused primarily on code and database performance.  It's an area that I have a passion for, as well as a propensity.  But what I've found is that its very hard to change the culture of a development environment.  You can teach performance, you can encourage performance, you might see slight shift in how devs think about performance.  But without full management backing and support you wont get long lasting changes in the development culture.  And in the end, you are back to being the "Perf Guy", fixing performance design flaws, after the fact, one by one by one. Which is why last year I asked my boss to changed my title and responsibilities to more naturally align with the team I was working for.  So now I'm a Computing Research Engineer (vague, I know), researching in the field of Big Data analytics and visualization. I've found this change revitalizing and a lot of fun.  And given the nature of Big Data (its, um…big) the performance aspects are always ever present.

    Read the article

  • Word 2010 Navigation Pane and more

    - by Daniel Moth
    I have been using Office 2010 since Beta1 and have not looked back since. I am currently on an internal RC, but will upgrade tomorrow to the RTM version. There are a plethora of new productivity features and for Word 2010 the one that overshadows everything else, IMO, is the Navigation Pane. I could spend time describing it here, but I'll never be able to cover it more thoroughly than what the product team has on their blog post. You enable it via the "Navigation Pane" checkbox in the "Show" group of the "View" tab on the Word ribbon. Even if you have come across this new Word 2010 feature, trust me you will learn something more about it, you will thank me later. Go learn how to make the most of the new Navigation Pane.             As an aside, there are many new benefits in PowerPoint 2010 too, my favorite being support for sections. Not to leave Excel 2010 out, you should check Excel's integration with HPC Server. Comments about this post welcome at the original blog.

    Read the article

  • Configuring Request-Reply in JMSAdapter

    - by [email protected]
    Request-Reply is a new feature in 11g JMSAdapter that helps you achieve the following:Allows you to combine Request and Reply in a single step. In the prior releases of the Oracle SOA Suite, you would require to configure two distinct adapters. Performs automatic correlation without you needing to configure BPEL "correlation sets". This would work seamlessly in Mediator and BPMN as well.In order to configure the JMSAdapter Request-Reply, please follow these steps:1) Drag and drop a JMSAdapter onto the "External References" swim lane in your composite editor. 2) Enter default values for the first few screens in the JMS Adapter wizard till you hit the screen where the wizard prompts you to enter the operation name. Select "Request-Reply" as the "Operation Type" and Asynchronous as "Operation Name".3) Select the Request and Reply queues in the following screens of the wizard. The message will be en-queued in the "Request" queue and the reply will be returned in the "Reply" queue. The reason I have used such a selector is that the back-end system that reads from the request queue and generates the response in the response queue actually generates more than one response and hence I must use a filter to exclude the unwanted responses.4) Select the message schema for request as well as response. 5) Add an <invoke> activity in BPEL corresponding to the JMS Adapter partner link. Please note that I am setting an additional header as my third-party application requires this.6) Add a <receive> activity just after the <invoke> and select the "Reply" operation. Please make sure that the "Create Instance" option is unchecked.Your completed BPEL process will something like this:

    Read the article

  • Windows XP stay logged in

    - by VEC
    Is there a way to make Windows XP stay logged in even after the user logs off? Right now the PCs log in at start up and we're using WinOFF to shut down the computer after X minutes of inactivity. The problem is that WinOFF does not work when the user logs off and stays in the "Select user login" screen. I'm thinking a possible solution would be to make the computer log back in as the default user after Y minutes of inactivity. How can I make it so that Windows XP logs in automatically after the user logs off?

    Read the article

  • How to backup boot information of a PC's Hard Disk?

    - by Bear Bear
    I just installed Windows 7 on a partition of my hard disk and I'm planning to install Vista and Windows 8 on other partitions on the same disk, and maybe a few Linux distributions too. Before I install other Operating Systems, I would like to backup the boot information, just to make sure I can get back to Windows 7 in case anything goes wrong with the booting data. I already made a backup of the MBR using MBRFix but I'm wondering if I should save some Boot Sector from the Windows 7 partition? I noticed that Windows Vista install DVD has a "bootrec.exe" utility in the recovery console (Shift+F10) and it has some options to rewrite the boot sector of the partitions. Therefore I wonder if there is any utility (preferably on Hiren's BootCD) to backup/write the boot sector I would also like to know how to backup the boot data of a Linux installation

    Read the article

  • Boot drive is incorrect one.

    - by Dwayne
    I have several hard drives installed. I normally use c: as my boot drive and a much larger drive (h:) for storing most of my files. I found a subfolder in my c:windows folder named windows after a failed reinstall of Vista. Upon inspection I determined it to be older than the c:windows folder and therefore it must be the older, working version of the boot. I renamed the c:windows folder to c:windows.bad and moved the sub windows to the c: root directory. I also copied it to the h: drive. Now MSCONFIG reports that the copy that is booting is the h: copy. How can I change it back to the c: copy and can I delete the c:windows.bad file set?

    Read the article

  • Issue with IIS...SERVER APPLICATION UNAVAILABLE

    - by SVI
    My web application was running absolutely fine. Just 2 days back, I got an error saying. SERVER APPLICATION UNAVAILABLE I am pretty certain that nothing was changed on IIS. Unless my automatic Windows updates screwed it up completely. My event viewer had zillions of following errors in Application category. aspnet_wp.exe could not be started. The error code for the failure is C0000005. This error can be caused when the worker process account has insufficient rights to read the .NET Framework files. Please ensure that the .NET Framework is correctly installed and that the ACLs on the installation directory allow access to the configured account. I reinstalled IIS. After installing, i ran aspnet_regiis -i for framework v2 and now it throws error saying - The application could not be initialized properly. Any ideas what going on?

    Read the article

  • Cannot boot to HDD or Optical when Motherboard in AHCI mode

    - by Shevek
    I have an Abit AB9 QuadGT motherboard and am trying to swap over to AHCI mode. I have an existing Windows 7 installation which was installed under IDE mode. I have set the msahci registry setting to 0. When I try to boot in AHCI mode I get "DISK BOOT FAILURE, INSERT SYSTEM DISK AND PRESS ENTER". I have tried booting with my Win 7 DVD in the optical drive. There is 1 SSD (System), 1 HDD (Data) and 2 optical drives connected via SATA If I switch back to IDE mode everything boots fine, either from the SSD or from a CD or DVD in the optical drive. Why can't I use AHCI mode?

    Read the article

  • Use pt-table-sync to setup a new MySQL DB

    - by Generation D Systems
    I have 2 hosts (A and B). B contains a MySQL server with a database called mydb, and A contains a MySQL server with nothing (fresh install). I want to replicate the entire mydb from B to A, by running a script on A (I do not have shell access to B). Can I run this on A: pt-table-sync --execute h=b.mydomain.com,D=mydb h=a.mydomain.com I've read the docs but don't get a 100% comfort feeling (perhaps because of all the warnings about damaging your data if you don't know what you're doing). Will this work? as well, is h=a.mydomin.com necessary? (Will it route all traffic back in/out the local NIC?) can I use localhost or nothing at all?

    Read the article

  • Black GUI with minimal desktop icons appeared after powering on my desktop PC

    - by Christopher Chipps
    My computer powered on fine but after POST, a dialog box appeared with a red "X" and it gave some sort of warning. It had a long file name, I cannot recollect the entirety of it but it was something like C:/system32/desktop....After clicking ok, the GUI was totally black with only the Recycle Bin icon in the Desktop, and the Taskbar was there as well. I restarted it, and the GUI was back to normal with the icons and wallpaper in their proper place. I'm sure if I knew more of that file name in the dialog box, that would be helpful to those reading this but should I be concerned that this happened?

    Read the article

  • Ubuntu Server on Proliant ML350 G4

    - by eduardoavdr
    Hi Everyone, I have been given the task to change OS of a HP Proliant ML350 G4 server, and I decided to use Ubuntu server edition for that matter. The thing is that the server has already installed Windows server 2000 on the only Hard drive it has (SCSI). My question is, could I install an IDE HD on the IDE connection it has and install ubuntu without overwritting the boot configuration, so if I wanted to go back to the windows 2000 server installation with no problems? It also has a tape drive which is used for backups. Do you guys know how buntu deals with such devices? Thanks for your time

    Read the article

  • ISPConfig 3 SSL automatic rewrite

    - by lol
    I was wondering how you could get apache2 to redirect http://server.com:8080 to https://server.com:8080 - I have an ISPConfig 3 setup and the http://server.com:8080 virtual host currently prints a 400 back request error given that I've tried adding RewriteEngine on RewriteCond %{HTTPS} !^on$ [NC] RewriteRule . https://%{HTTP_HOST}:8080%{REQUEST_URI} [L] to the ispconfig.vhost file (and reloading the conf) with no success --edit!-- I've been playing around with it and adding an 'always redirect to google' into the ispconfig vhost and it works once you've already started talking ssl to it. this means the non-ssl connections are getting 'bad request errors' before the vhost is loaded... but where...? --edit 2!-- nope, the ssl is handled exclusively by the virtual host - if I turn off the ssl engine then the rewriting works perfectly (but obviously there is no ssl at https://) thanks!

    Read the article

  • Disk Redundancy across different server

    - by Mascarpone
    I have 3 servers, all with the same specs: Intel CPU 8 GB RAM Linux or BSD Single 2TB desktop SATA with more than 10K Hours of operation, with only less than 300 GB Used My provider cannot install a second hard drive, but can guarantee me that the drive will be replaced immediately in case of failure, with another equally crappy drive. The likelihood of drive failure is high, and since I can't use RAID, I was thinking about keeping a back up of each machine on all the other machines, so that there are always 2 copies on 2 different drives, plus the original. I would synchronize the drives every hour, with rsync, to guarantee some sort of redundancy, since bandwidth inside the DC is free, so it would be much cheaper than offsite backup. (A daily offiste backup is kept anyhow). What do you think? Any suggestion?

    Read the article

  • Can I switch input methods while Caps Lock is being held down on Windows?

    - by Syzygy
    On my Linux computer, my keyboard switches from English to Serbian when I hold the Caps Lock key. For example, to write c all I have to do is hold Caps Lock, and press the key where c is on the Serbian keyboard (in this case, they key is ; on the English keyboard). When I release Caps Lock, the keyboard "switches back" to English, so that if I press ; I get ; as desired. Super useful. Please note that I know how to change the keyboard layout. I want to use Caps Lock as a modifier key to change the language only while being held down! Is there a way to replicate this behavior on Windows 7 or Windows 8?

    Read the article

  • Passwords and Keys in Linux

    - by PeanutsMonkey
    In a fit of desperation when I had my wireless connection die on me, I thought it was a problem with the key I had created at the start when I initially configured the wireless connection and hence deleted it. The option to create the key had presented itself when I created the wireless connection. It no longer asks me to. Now I am back online, do I have re-create the password and key I had before? If so, what do I choose and why? The options I have are as follows; PGP Stored password Password keyring Secure shell key The first and last option seem to be obvious and I have no idea about the differences between the second and third options. Why do I need a stored password or password keyring in all scenarios and not just the wireless issue I ran into? EDIT 0 Further to Belisama's comment, I have amended my question. EDIT 1 As requested, I have attached a screenshot

    Read the article

  • How do I disable other monitors while running games in Wine?

    - by Michael Cheng
    My current setup is: * Dual GTS 250 video cards * 3 Monitors * Used nvidia-settings to run each monitor as a separate x session * This is all running on Linux Mint Debian Edition When running games (Starcraft II) in Wine via PlayOnLinux, I've found that the mouse does not get locked. I already tried various solutions littered across the web and none work so I'd rather just disable my other two monitors while playing. Does anyone know of a method where I can turn off my other two monitors (not my primary monitor) while running Wine and then turn then back on afterwards? I don't mind having to manually run a script before and after gaming. Thanks.

    Read the article

  • What can I do to prevent my user folder from being tampered with by malicious software?

    - by Tom Wijsman
    Let's assume some things: Back-ups do run every X minutes, yet the things I save should be permanent. There's a firewall and virus scanner in place, yet there happens to be a zero day attack on me. I am using Windows. (Although feel free to append Linux / OS X parts to your answer) Here is the problem Any software can change anything inside my user folder. Tampering with the files could cost me my life, whether it's accessing / modifying or wiping them. So, what I want to ask is: Is there a permission-based way to disallow programs from accessing my files in any way by default? Extending on the previous question, can I ensure certain programs can only access certain folders? Are there other less obtrusive ways than using Comodo? Or can I make Comodo less obtrusive? For example, the solution should be proof against (DO NOT RUN): del /F /S /Q %USERPROFILE%

    Read the article

  • How to reset MacOsX while keeping BootCamp?

    - by ss814
    I have MacOsX 10.8.2 installed on my MacBook Pro and Windows 8 licenced on a BootCamp partition. I have messed up my MacOsx partition (problems while programming, .h files not found, old applications removed that still appears) and I wanna start back from a clean OS. Is there a Way to reset my partition (or reinstall, obviously) keeping my BootCamp partition safe ? I know I could use my recovery partition but I do not know if it won't delete my Windows and it no longer appears in disk utility. As I found no answers in the Internet, does someone how how to do that ? Thanks in advance.

    Read the article

  • Switching from Java/Java EE career path to C POS path?

    - by Muhammad
    I am a Java/Java EE Developer with about 3 years in this field. I like low-level programming so much... I favor back-end code over front-end. I've a knowledge in C and know little about C++. I got an offer to work with C in Point-of-Sale Payment terminals. I don't know much about how POS works (IDE/toolsets, etc). although I have a payment experience (ISO8583, etc...) I need you own opinion from Switching from the Java's High-level world to POS low-level world Although I love low-level world, but I am afraid from not being found what I seek.. I know programmers are not measured by the tools they use (including prog. langs.) but with their minds. I need your opinions of: Is programming POS terminals in C is an interesting thing, or I'll find myself doing usual code-writing job? (especially I am about to switch my whole career path). I find myself writing an elegant code in Java (like: Sobat http://code.google.com/p/sobat/) a code where I find myself in... So do I'll find the same thing in POS C? or It will all about Libraries that I'll call to finish my work?! Lastly, does this thing worse adventure with my current career (stability, conference, etc.. )? (as I currently don't think to move to a new job) Thanks.

    Read the article

  • Is it possible to have a computer run two OS's in memory at the same time?

    - by Hebon
    I'm sick of needing to reboot my computer every time I wish to use another OS, or run a virtual machine that skimps on power. With the onset of large amounts of memory for computers nowadays I began to think that there must be some way to run two OS's in memory with a way to switch between the two. In my mind, it doesn't seem too difficult; a compatibility layer boots up after bios, which in turn boots to OS1. While in OS1, software is run that triggers a save to ram boots back to the compatability layer, and then boots to OS2. This way, the OS's can be used side by side and boot times are cut drastically short since both OSs are already in ram. Both OS's have their own designated and protected memory so there is no problem there... I mean, it seems fine, but no one has done it, so there must be some reason as to why. I would love some insight into this please.

    Read the article

  • Dell PR03X port replicator and DisplayPort to DVI adapter not detecting second monitor

    - by yothenberg
    I have a Dell M4400 connected to a PR03X port replicator/docking station. I use the DVI port to connect it to a first Dell 2208WFP monitor and I'm trying to use a DisplayPort-to-DVI adapter to connect it to a second Dell 2208WFP monitor. The second monitor, connected via the DisplayPort-to-DVI adapter immediately goes into sleep mode and the laptop doesn't detect it. What is really weird is that it did detect it the first time I plugged it in but after I unplugged the monitor and plugged it back in it stopped working. I swapped the monitors round and it detected them both but after unplugging the monitor connected via the DisplayPort-to-DVI and plugging it in again it stopped working. Both monitors work if plugged in directly to the DVI port. Is there some way to force re-detection? Any ideas?

    Read the article

  • Use Your Chart-Drawing Skills to Win a Free Chrome Cr-48 Notebook

    - by ETC
    Today Google announced that they are partnering with a number of Chrome web application developers to distribute a number of their Chrome OS Notebooks to lucky fans. That’s when we noticed something interesting that can greatly increase your odds of getting one. Unlike Box, MOG, and Zoho, who are doing random giveaways, the LucidChart giveaway is based on a contest of skill – they are picking the best drawings using their flowchart tool and giving away Chrome Notebooks to the winners. So all you have to do is create one of the most interesting drawings / charts, and you will get your hands on one. We’ve also confirmed this with the fine people at LucidChart, who told us “any user who spends a bit of time and effort to do something creative has a good shot at winning one.” How great is the Chrome Cr-48 Notebook? What’s it all about? We wouldn’t know, since Google hasn’t given us here at How-To Geek an opportunity to use one, despite our attempts. It’s sad, since we’re huge fans of the Chrome browser, that we can’t share our Chrome notebook experiences with hundreds of thousands of daily subscribers and millions of monthly visitors. Hint. Hint. Win a Chrome Cr-48 notebook from LucidChart [LucidChart] Latest Features How-To Geek ETC How To Create Your Own Custom ASCII Art from Any Image How To Process Camera Raw Without Paying for Adobe Photoshop How Do You Block Annoying Text Message (SMS) Spam? How to Use and Master the Notoriously Difficult Pen Tool in Photoshop HTG Explains: What Are the Differences Between All Those Audio Formats? How To Use Layer Masks and Vector Masks to Remove Complex Backgrounds in Photoshop Bring Summer Back to Your Desktop with the LandscapeTheme for Chrome and Iron The Prospector – Home Dash Extension Creates a Whole New Browsing Experience in Firefox KinEmote Links Kinect to Windows Why Nobody Reads Web Site Privacy Policies [Infographic] Asian Temple in the Snow Wallpaper 10 Weird Gaming Records from the Guinness Book

    Read the article

  • How to deal with OpenGL and Fullscreen on OS X

    - by Armin Ronacher
    I do most of my development on OS X and for my current game project this is my target environment. However when I play games I play on Windows. As a windows gamer I am used to Alt+Tab switching from within the game to the last application that was open. On OS X I currently can't find either a game that supports that nor can I find a way to make it possible. My current project is based on SDL 1.3 and I can see that cmd+tab is a sequence that is sent directly to my application and not intercepted by the operating system. Now my first attempt was to hide the rendering window on cmd+tab which certainly works, but has the disadvantage that a hidden OpenGL window in SDL cannot be restored when the user tabs back to the application. First of all, there is no event fired for that or I can't find it, secondly the core problem is that when that application window is hidden, my game is still the active application, just that the window disappeared. That is incredible annoying. Any ideas how to approximate the windows / linux behavior for alt+tab?

    Read the article

  • C#: Why Decorate When You Can Intercept

    - by James Michael Hare
    We've all heard of the old Decorator Design Pattern (here) or used it at one time or another either directly or indirectly.  A decorator is a class that wraps a given abstract class or interface and presents the same (or a superset) public interface but "decorated" with additional functionality.   As a really simplistic example, consider the System.IO.BufferedStream, it itself is a descendent of System.IO.Stream and wraps the given stream with buffering logic while still presenting System.IO.Stream's public interface:   1: Stream buffStream = new BufferedStream(rawStream); Now, let's take a look at a custom-code example.  Let's say that we have a class in our data access layer that retrieves a list of products from a database:  1: // a class that handles our CRUD operations for products 2: public class ProductDao 3: { 4: ... 5:  6: // a method that would retrieve all available products 7: public IEnumerable<Product> GetAvailableProducts() 8: { 9: var results = new List<Product>(); 10:  11: // must create the connection 12: using (var con = _factory.CreateConnection()) 13: { 14: con.ConnectionString = _productsConnectionString; 15: con.Open(); 16:  17: // create the command 18: using (var cmd = _factory.CreateCommand()) 19: { 20: cmd.Connection = con; 21: cmd.CommandText = _getAllProductsStoredProc; 22: cmd.CommandType = CommandType.StoredProcedure; 23:  24: // get a reader and pass back all results 25: using (var reader = cmd.ExecuteReader()) 26: { 27: while(reader.Read()) 28: { 29: results.Add(new Product 30: { 31: Name = reader["product_name"].ToString(), 32: ... 33: }); 34: } 35: } 36: } 37: }            38:  39: return results; 40: } 41: } Yes, you could use EF or any myriad other choices for this sort of thing, but the germaine point is that you have some operation that takes a non-trivial amount of time.  What if, during the production day I notice that my application is performing slowly and I want to see how much of that slowness is in the query versus my code.  Well, I could easily wrap the logic block in a System.Diagnostics.Stopwatch and log the results to log4net or other logging flavor of choice: 1:     // a class that handles our CRUD operations for products 2:     public class ProductDao 3:     { 4:         private static readonly ILog _log = LogManager.GetLogger(typeof(ProductDao)); 5:         ... 6:         7:         // a method that would retrieve all available products 8:         public IEnumerable<Product> GetAvailableProducts() 9:         { 10:             var results = new List<Product>(); 11:             var timer = Stopwatch.StartNew(); 12:             13:             // must create the connection 14:             using (var con = _factory.CreateConnection()) 15:             { 16:                 con.ConnectionString = _productsConnectionString; 17:                 18:                 // and all that other DB code... 19:                 ... 20:             } 21:             22:             timer.Stop(); 23:             24:             if (timer.ElapsedMilliseconds > 5000) 25:             { 26:                 _log.WarnFormat("Long query in GetAvailableProducts() took {0} ms", 27:                     timer.ElapsedMillseconds); 28:             } 29:             30:             return results; 31:         } 32:     } In my eye, this is very ugly.  It violates Single Responsibility Principle (SRP), which says that a class should only ever have one responsibility, where responsibility is often defined as a reason to change.  This class (and in particular this method) has two reasons to change: If the method of retrieving products changes. If the method of logging changes. Well, we could “simplify” this using the Decorator Design Pattern (here).  If we followed the pattern to the letter, we'd need to create a base decorator that implements the DAOs public interface and forwards to the wrapped instance.  So let's assume we break out the ProductDAO interface into IProductDAO using your refactoring tool of choice (Resharper is great for this). Now, ProductDao will implement IProductDao and get rid of all logging logic: 1:     public class ProductDao : IProductDao 2:     { 3:         // this reverts back to original version except for the interface added 4:     } 5:  And we create the base Decorator that also implements the interface and forwards all calls: 1:     public class ProductDaoDecorator : IProductDao 2:     { 3:         private readonly IProductDao _wrappedDao; 4:         5:         // constructor takes the dao to wrap 6:         public ProductDaoDecorator(IProductDao wrappedDao) 7:         { 8:             _wrappedDao = wrappedDao; 9:         } 10:         11:         ... 12:         13:         // and then all methods just forward their calls 14:         public IEnumerable<Product> GetAvailableProducts() 15:         { 16:             return _wrappedDao.GetAvailableProducts(); 17:         } 18:     } This defines our base decorator, then we can create decorators that add items of interest, and for any methods we don't decorate, we'll get the default behavior which just forwards the call to the wrapper in the base decorator: 1:     public class TimedThresholdProductDaoDecorator : ProductDaoDecorator 2:     { 3:         private static readonly ILog _log = LogManager.GetLogger(typeof(TimedThresholdProductDaoDecorator)); 4:         5:         public TimedThresholdProductDaoDecorator(IProductDao wrappedDao) : 6:             base(wrappedDao) 7:         { 8:         } 9:         10:         ... 11:         12:         public IEnumerable<Product> GetAvailableProducts() 13:         { 14:             var timer = Stopwatch.StartNew(); 15:             16:             var results = _wrapped.GetAvailableProducts(); 17:             18:             timer.Stop(); 19:             20:             if (timer.ElapsedMilliseconds > 5000) 21:             { 22:                 _log.WarnFormat("Long query in GetAvailableProducts() took {0} ms", 23:                     timer.ElapsedMillseconds); 24:             } 25:             26:             return results; 27:         } 28:     } Well, it's a bit better.  Now the logging is in its own class, and the database logic is in its own class.  But we've essentially multiplied the number of classes.  We now have 3 classes and one interface!  Now if you want to do that same logging decorating on all your DAOs, imagine the code bloat!  Sure, you can simplify and avoid creating the base decorator, or chuck it all and just inherit directly.  But regardless all of these have the problem of tying the logging logic into the code itself. Enter the Interceptors.  Things like this to me are a perfect example of when it's good to write an Interceptor using your class library of choice.  Sure, you could design your own perfectly generic decorator with delegates and all that, but personally I'm a big fan of Castle's Dynamic Proxy (here) which is actually used by many projects including Moq. What DynamicProxy allows you to do is intercept calls into any object by wrapping it with a proxy on the fly that intercepts the method and allows you to add functionality.  Essentially, the code would now look like this using DynamicProxy: 1: // Note: I like hiding DynamicProxy behind the scenes so users 2: // don't have to explicitly add reference to Castle's libraries. 3: public static class TimeThresholdInterceptor 4: { 5: // Our logging handle 6: private static readonly ILog _log = LogManager.GetLogger(typeof(TimeThresholdInterceptor)); 7:  8: // Handle to Castle's proxy generator 9: private static readonly ProxyGenerator _generator = new ProxyGenerator(); 10:  11: // generic form for those who prefer it 12: public static object Create<TInterface>(object target, TimeSpan threshold) 13: { 14: return Create(typeof(TInterface), target, threshold); 15: } 16:  17: // Form that uses type instead 18: public static object Create(Type interfaceType, object target, TimeSpan threshold) 19: { 20: return _generator.CreateInterfaceProxyWithTarget(interfaceType, target, 21: new TimedThreshold(threshold, level)); 22: } 23:  24: // The interceptor that is created to intercept the interface calls. 25: // Hidden as a private inner class so not exposing Castle libraries. 26: private class TimedThreshold : IInterceptor 27: { 28: // The threshold as a positive timespan that triggers a log message. 29: private readonly TimeSpan _threshold; 30:  31: // interceptor constructor 32: public TimedThreshold(TimeSpan threshold) 33: { 34: _threshold = threshold; 35: } 36:  37: // Intercept functor for each method invokation 38: public void Intercept(IInvocation invocation) 39: { 40: // time the method invocation 41: var timer = Stopwatch.StartNew(); 42:  43: // the Castle magic that tells the method to go ahead 44: invocation.Proceed(); 45:  46: timer.Stop(); 47:  48: // check if threshold is exceeded 49: if (timer.Elapsed > _threshold) 50: { 51: _log.WarnFormat("Long execution in {0} took {1} ms", 52: invocation.Method.Name, 53: timer.ElapsedMillseconds); 54: } 55: } 56: } 57: } Yes, it's a bit longer, but notice that: This class ONLY deals with logging long method calls, no DAO interface leftovers. This class can be used to time ANY class that has an interface or virtual methods. Personally, I like to wrap and hide the usage of DynamicProxy and IInterceptor so that anyone who uses this class doesn't need to know to add a Castle library reference.  As far as they are concerned, they're using my interceptor.  If I change to a new library if a better one comes along, they're insulated. Now, all we have to do to use this is to tell it to wrap our ProductDao and it does the rest: 1: // wraps a new ProductDao with a timing interceptor with a threshold of 5 seconds 2: IProductDao dao = TimeThresholdInterceptor.Create<IProductDao>(new ProductDao(), 5000); Automatic decoration of all methods!  You can even refine the proxy so that it only intercepts certain methods. This is ideal for so many things.  These are just some of the interceptors we've dreamed up and use: Log parameters and returns of methods to XML for auditing. Block invocations to methods and return default value (stubbing). Throw exception if certain methods are called (good for blocking access to deprecated methods). Log entrance and exit of a method and the duration. Log a message if a method takes more than a given time threshold to execute. Whether you use DynamicProxy or some other technology, I hope you see the benefits this adds.  Does it completely eliminate all need for the Decorator pattern?  No, there may still be cases where you want to decorate a particular class with functionality that doesn't apply to the world at large. But for all those cases where you are using Decorator to add functionality that's truly generic.  I strongly suggest you give this a try!

    Read the article

< Previous Page | 486 487 488 489 490 491 492 493 494 495 496 497  | Next Page >