Software Design Patterns : The Primer : Introduction
My primary work is designing. I earn my living by designing applications small and large. And because designing software more or less is bringing solution to problem, the steps you take also are similar. You break down the problem, you solve each piece using either your existing knowledge of learn from others and the complete the solution, you reuse the same methods to solve the same kind of problems. This is what is called a pattern, a pattern is all about how you approach the problem, its not about semantics on how you solve a particular piece.
Software Design patterns are also the same, its about how you solve common problems that are encountered every time you design a software. A pattern has less to do with actual code and more to do with the approach(or can be eloquently put as less to do with algorithms). And patterns are abstractions over code meaning there is no set conventions on a pattern like naming of classes etc, and also that these patterns have no barrier of programming language, there are some specific cases where few patters make more sense on a particular programming platform, but in general you should be able to use them across languages and platforms. And if you are into LOB applications its pretty certain that somebody else has already solved the problem that you are facing. So Its better to know about the existing patterns and how they can help you solve your problems, and Patterns range wide, starting from a very simple one which makes say a Data Structure mode bind able to issues in enterprise architecture.
Design Patterns can be classified into categories based on what problems you are trying to solve and the list is fairly extensive, just to pull of few on top of my head
- Creation
- Functional
- Parallel Programming
- Behavioral
- Security
- User Interface
- Concurrency
- Distributed Computing
- Relational
and the list is growing and as new problems and new ways of solving them are found.
So the big question why should I care about Design Patterns ?, The simplest answer for this question is that you do not reinvent a wheel, the problem you are facing in software architecture is not always unique and understanding patterns will get you started quickly in solving the problems. Benefits also include decrease in effort and improvement in development time, and the application will generally have a better design and can be universally understandable.
So What Next? Over the next series of posts I plan to put information on few of the simple patters to more complex ones, I am trying to make this as simple as possible and get the discussion started, and even though design patters are fairly simple to understand what I would be writing is just my understanding and experience and should not be considered the final authority. I also plan to do simple implementation examples and again those would be just mine. For the simpler Patterns i would be using C# as the language but down the line when we get to say MVVM I also plan to include some iOS Code.
To begin with I will be writing about the Command Pattern which according to me is a highly reused pattern.
Find Control of a Type in WPF
I had previously written a piece of Code to retrieve a control of a single type in ASP.net, now working on WPF I had to do basically the same thing, and VisualTreeHelper came to the rescue.
In this process I discovered that if the content of the user control/window is a scroll panel you have to reference the scroll panel. so without further blabber , here is the code. (Please Note that this also works with controls inside a groupbox)
public static class VisualEnumerable { /// <summary> /// Gets the Visual Tree filtered by Type for a DependencyObject with that DependencyObject as the root. /// </summary> public static IEnumerable<t> GetVisualOfType</t><t>(this DependencyObject element) { var temp = GetVisualTree(element).ToList(); return temp.Where(t => t.GetType() == typeof(T)).Cast</t><t>(); } /// <summary> /// Gets the Visual Tree for a DependencyObject with that DependencyObject as the root. /// </summary> public static IEnumerable<dependencyobject> GetVisualTree(this DependencyObject element) { int childrenCount = VisualTreeHelper.GetChildrenCount(element); for (int i = 0; i < childrenCount; i++) { var visualChild = VisualTreeHelper.GetChild(element, i); if (visualChild != null) yield return visualChild; if (visualChild is GroupBox) { var gb = visualChild as GroupBox; object gpChild = gb.Content; yield return visualChild; visualChild = (DependencyObject)gpChild; } foreach (var visualChildren in GetVisualTree(visualChild)) { yield return visualChildren; } } } }
To Use this you can simply do
var textboxes = this.MainPanel.GetVisualOfType<textbox>() </textbox>
Recover Jobs from a crashed SQL Server
I recently came across the scenario where a SQL server had crashed (with Windows) but the file system was intact, so we started restore of databases which was straight forward as easy as attaching to the new instance on different server. But we also had lot of jobs scheduled on the old server, and wanted to recover them as well, so after a doing a bit of search figured out that the jobs are saved in “msdb” system database.
- Create a dummy instance of SQL Server.
- Stop the instance.
- Replace the .mdf & .ldf files from the crashed server of the msdb database.
- Start the Server Instance as well as agent.
- voila, you have your jobs, now script those jobs and execute on new server
and you are good to go..
Nifty Little script to check identity columns
I had to recently check for identity specification on all the tables in a database and this nifty little script helped me in doing this.
CREATE PROC dbo.CheckIdentities AS BEGIN SET NOCOUNT ON SELECT QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) AS TableName, c.name AS ColumnName, CASE c.system_type_id WHEN 127 THEN 'bigint' WHEN 56 THEN 'int' WHEN 52 THEN 'smallint' WHEN 48 THEN 'tinyint' END AS 'DataType', IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) AS CurrentIdentityValue, CASE c.system_type_id WHEN 127 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) * 100.) / 9223372036854775807 WHEN 56 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) * 100.) / 2147483647 WHEN 52 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) * 100.) / 32767 WHEN 48 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) * 100.) / 255 END AS 'PercentageUsed' FROM sys.COLUMNS AS c INNER JOIN sys.TABLES AS t ON t.[object_id] = c.[object_id] WHERE c.is_identity = 1 ORDER BY PercentageUsed DESC END
New Look & House Cleaning
For a long time i have kept the look for a photography portfolio for my site, but i felt that this was not updated for a long time, i havent done too much of photography in the last year and all unimportant ones have been pushed to Facebook, So i thought why not re organise and give more focus on blog, which at least is updated, so here is the new look, I really liked the tumbler look, thus a lovechild of wordpress and tumblr, and beacuse i did this there are still a few things which are completely broken like the photography posts, i am still resolving the best way to resolve this, ill update this post once done, please leave comments on this post if you feel anything needs to be addressed.
Asp.net ReportViewer : Access Remote Server Report with Credentials
If you want to work with remote SSRS report while debugging your asp.net application you would want to authenticate with the remote server, you cannot use asp.net impersonation as this would actually make the entire application run under impersonation so to solve this we can use impersonation for the report viewer only to do this :
#if (DEBUG) this.ReportViewer1.ServerReport.ReportServerCredentials = new ReportServerCredentials("username", "password","domain"); #endif
and a ReportServerCredentials class
public class ReportServerCredentials : IReportServerCredentials { private string _userName; private string _password; private string _domain; public ReportServerCredentials(string userName, string password, string domain) { _userName = userName; _password = password; _domain = domain; } public System.Security.Principal.WindowsIdentity ImpersonationUser { get { return null; } } public System.Net.ICredentials NetworkCredentials { get { return new System.Net.NetworkCredential(_userName, _password, _domain); } } bool IReportServerCredentials.GetFormsCredentials(out Cookie authCookie, out string userName, out string password, out string authority) { authCookie = null; userName = _userName; password = _password authority = _domain; return false; } }
Janlokpal Bill : An overview and my unanswered questions
I have been watching closely on what was happening with the entire process of fasts, demonstrations over Lokpal and Janlokpal bill, I went through the bullet points of Janlokpal bill and began wondering, how does this bill help in curbing corruption or for that matter bringing back the black money back to India, I have seen so many people get behind this movement most of them not knowing what the content of the bill is and how does it improve their lives, I know that people are fed up of corruption and want it rooted out but there is a lot more to this than just a bill.
Let us first discuss what Janlokpal bill wants to achieve and my doubts and counter arguments on why this would not be enough, All this keeping in mind that that I am not against the bill.
These are salient features of the bill (taken from http://www.indiaagainstcorruption.org/salient.html)
- An institution called LOKPAL at the centre and LOKAYUKTA in each state will be set up
- Like Supreme Court and Election Commission, they will be completely independent of the governments. No minister or bureaucrat will be able to influence their investigations.
- Cases against corrupt people will not linger on for years anymore: Investigations in any case will have to be completed in one year. Trial should be completed in next one year so that the corrupt politician, officer or judge is sent to jail within two years.
- The loss that a corrupt person caused to the government will be recovered at the time of conviction.
- How will it help a common citizen: If any work of any citizen is not done in prescribed time in any government office, Lokpal will impose financial penalty on guilty officers, which will be given as compensation to the complainant.
- So, you could approach Lokpal if your ration card or passport or voter card is not being made or if police is not registering your case or any other work is not being done in prescribed time. Lokpal will have to get it done in a month’s time. You could also report any case of corruption to Lokpal like ration being siphoned off, poor quality roads been constructed or panchayat funds being siphoned off. Lokpal will have to complete its investigations in a year, trial will be over in next one year and the guilty will go to jail within two years.
- But won’t the government appoint corrupt and weak people as Lokpal members? That won’t be possible because its members will be selected by judges, citizens and constitutional authorities and not by politicians, through a completely transparent and participatory process.
- What if some officer in Lokpal becomes corrupt? The entire functioning of Lokpal/ Lokayukta will be completely transparent. Any complaint against any officer of Lokpal shall be investigated and the officer dismissed within two months.
- What will happen to existing anti-corruption agencies? CVC, departmental vigilance and anti-corruption branch of CBI will be merged into Lokpal. Lokpal will have complete powers and machinery to independently investigate and prosecute any officer, judge or politician.
- It will be the duty of the Lokpal to provide protection to those who are being victimized for raising their voice against corruption.
So we are basically setting up a new institution which is supposed to be independent, but how can this institution be independent, how would the members of the committee be appointed, it is always mentioned that the committee would be comprised of eminent people, but who would the judge of this, we are the people who knowingly elect so called corrupt people into parliament, so should we be responsible for appointing people ? If not us then who is going to this.
The next being who is going to conduct the investigations and how can it me made sure that the investigations are unbiased, if the corrupt are able to coarse the existing investigation agencies, I am sure that this would be no exception, and how would the timeline of one year for investigation and one year for trail be met? where are the proposed changes for the judicial systems which would allow this timeline to come into existence ? And what would be the appeal process ? the officer/politician would always say that they have done nothing wrong and would want to appeal, In this scenario are they re investigated or would the initial investigation and judgement would be held authoritative ?
And i would not even try to address the point of recovery of loss from convicted as this seems too much hypothetical, good luck trying to get back money from A.Raja or Suresh Kalmadi.
And if Lokpal would be approached for every other issue, how is it going to address the huge list of complaints that it is going to receive ? again we would be ending up in a system which looks like our judicial system.
Again coming back to the process of selection of members this is a point which has not been addressed to in any of the discussions that i have seen. There is no guarantee that even after all the other anti corruption agencies are merged this institution would independent enough or that the people in this institution cannot be influenced, so how can this be addressed ?
The very first counter argument that i always receive is that this a begging step and and we would have to start somewhere. But if we are fighting for it so passionately why settle for first step why not for more? , I welcome you to join this discussion and educate me if I am wrong but I still don’t see light at the end of the dark tunnel of corruption we are in.
Reset your SQL Server login
Recently I faced a situation where the SQL Server was setup but no one knew the login, and the SQL server was not configured in Mixed Mode Authentication, so how do you recover from this situation other than re installing the instance,
Stop the running instance and then open up command prompt in Binn directory on the instance which would be something like
c:\Program Files\Microsoft SQL Server\MSSQL...\Binn
Run the following command
sqlservr.exe -m"SQLCMD"
This would start the instance in single user mode, now open up another command prompt in the same directory
and then run “SQLCMD”
and execute the following statements based on requirement
If you want to add a windows user use
CREATE login [DOMAIN\USERNAME] FROM windows; EXEC sys.sp_addsrvrolemember @loginame = N'DOMAIN\USERNAME', @rolename = N'sysadmin'; GO;
To add a SQL Server Login use (remember this works only if mixed mode authentication is enabled)
CREATE LOGIN [testAdmin] WITH PASSWORD=N'test@1234', DEFAULT_DATABASE=[master]; EXEC sys.sp_addsrvrolemember @loginame = N'testAdmin', @rolename = N'sysadmin'; GO;
now exit SQLCMD and also do CTRL+C on first window to stop instance and restart the instance in regular mode.
Zune Window in WPF
I have become a huge fan of Metro UI design and i really like the Zune interface and the starting point would be the custom chrome so i searched a bit and found this neat little thing , thought I would share
/// <summary> /// Borderless Window Behavior /// </summary> public class BorderlessWindowBehavior : Behavior<window> { #region Native Methods [StructLayout(LayoutKind.Sequential)] public struct MARGINS { public int leftWidth; public int rightWidth; public int topHeight; public int bottomHeight; } [DllImport("dwmapi.dll")] private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset); /// <summary> /// POINT aka POINTAPI /// </summary> [StructLayout(LayoutKind.Sequential)] public struct POINT { /// <summary> /// x coordinate of point. /// </summary> public int x; /// <summary> /// y coordinate of point. /// </summary> public int y; /// <summary> /// Construct a point of coordinates (x,y). /// </summary> public POINT(int x, int y) { this.x = x; this.y = y; } } [StructLayout(LayoutKind.Sequential)] public struct MINMAXINFO { public POINT ptReserved; public POINT ptMaxSize; public POINT ptMaxPosition; public POINT ptMinTrackSize; public POINT ptMaxTrackSize; }; /// <summary> /// </summary> [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class MONITORINFO { public int cbSize = Marshal.SizeOf(typeof(MONITORINFO)); public RECT rcMonitor = new RECT(); public RECT rcWork = new RECT(); public int dwFlags = 0; } /// <summary> Win32 </summary> [StructLayout(LayoutKind.Sequential, Pack = 0)] public struct RECT { /// <summary> /// Win32 /// </summary> public int left; /// <summary> /// Win32 /// </summary> public int top; /// <summary> /// Win32 /// </summary> public int right; /// <summary> /// Win32 /// </summary> public int bottom; /// <summary> /// Win32 /// </summary> public static readonly RECT Empty = new RECT(); /// <summary> /// Win32 /// </summary> public int Width { // Abs needed for BIDI OS get { return Math.Abs(right - left); } } /// <summary> /// Win32 /// </summary> public int Height { get { return bottom - top; } } /// <summary> /// Win32 /// </summary> /// <param name="left">The left.</param> /// <param name="top">The top.</param> /// <param name="right">The right.</param> /// <param name="bottom">The bottom.</param> public RECT(int left, int top, int right, int bottom) { this.left = left; this.top = top; this.right = right; this.bottom = bottom; } /// <summary> /// Win32 /// </summary> /// <param name="rcSrc">The rc SRC.</param> public RECT(RECT rcSrc) { this.left = rcSrc.left; this.top = rcSrc.top; this.right = rcSrc.right; this.bottom = rcSrc.bottom; } /// <summary> /// Win32 /// </summary> /// <value> /// <c>true</c> if this instance is empty; otherwise, <c>false</c>. /// </value> public bool IsEmpty { get { // BUGBUG : On Bidi OS (hebrew arabic) left > right return left >= right || top >= bottom; } } /// <summary> /// Return a user friendly representation of this struct /// </summary> /// <returns> /// A <see cref="System.String"/> that represents this instance. /// </returns> public override string ToString() { if (this == RECT.Empty) return "RECT {Empty}"; return String.Format("RECT {{ left : {0} / top : {1} / right : {2} / bottom : {3} }}", left, top, right, bottom); } /// <summary> /// Determine if 2 RECT are equal (deep compare) /// </summary> /// <param name="obj">The <see cref="System.Object"/> to compare with this instance.</param> /// <returns> /// <c>true</c> if the specified <see cref="System.Object"/> is equal to this instance; otherwise, <c>false</c>. /// </returns> public override bool Equals(object obj) { if (!(obj is Rect)) return false; return (this == (RECT)obj); } /// <summary> /// Return the HashCode for this struct (not guaranteed to be unique) /// </summary> /// <returns> /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. /// </returns> public override int GetHashCode() { return left.GetHashCode() + top.GetHashCode() + right.GetHashCode() + bottom.GetHashCode(); } /// <summary> /// Determine if 2 RECT are equal (deep compare) /// </summary> /// <param name="rect1">The rect1.</param> /// <param name="rect2">The rect2.</param> /// <returns> /// The result of the operator. /// </returns> public static bool operator ==(RECT rect1, RECT rect2) { return (rect1.left == rect2.left && rect1.top == rect2.top && rect1.right == rect2.right && rect1.bottom == rect2.bottom); } /// <summary> /// Determine if 2 RECT are different (deep compare) /// </summary> /// <param name="rect1">The rect1.</param> /// <param name="rect2">The rect2.</param> /// <returns> /// The result of the operator. /// </returns> public static bool operator !=(RECT rect1, RECT rect2) { return !(rect1 == rect2); } } /// <summary> /// Gets the monitor info. /// </summary> /// <param name="hMonitor">The h monitor.</param> /// <param name="lpmi">The lpmi.</param> /// <returns></returns> [DllImport("user32")] internal static extern bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi); /// <summary> /// Monitors from window. /// </summary> /// <param name="handle">The handle.</param> /// <param name="flags">The flags.</param> /// <returns></returns> [DllImport("User32")] internal static extern IntPtr MonitorFromWindow(IntPtr handle, int flags); /// <summary> /// Wms the get min max info. /// </summary> /// <param name="hwnd">The HWND.</param> /// <param name="lParam">The l param.</param> private static void WmGetMinMaxInfo(System.IntPtr hwnd, System.IntPtr lParam) { MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); // Adjust the maximized size and position to fit the work area of the correct monitor int MONITOR_DEFAULTTONEAREST = 0x00000002; System.IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); if (monitor != System.IntPtr.Zero) { MONITORINFO monitorInfo = new MONITORINFO(); GetMonitorInfo(monitor, monitorInfo); RECT rcWorkArea = monitorInfo.rcWork; RECT rcMonitorArea = monitorInfo.rcMonitor; mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left); mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top); mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left); mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top); } Marshal.StructureToPtr(mmi, lParam, true); } /// <summary> /// Defs the window proc. /// </summary> /// <param name="hwnd">The HWND.</param> /// <param name="msg">The MSG.</param> /// <param name="wParam">The w param.</param> /// <param name="lParam">The l param.</param> /// <returns></returns> [DllImport("user32.dll")] public static extern IntPtr DefWindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam); #endregion private const int WM_NCCALCSIZE = 0x83; private const int WM_NCPAINT = 0x85; private const int WM_NCACTIVATE = 0x86; private const int WM_GETMINMAXINFO = 0x24; private HwndSource m_hwndSource; private IntPtr m_hwnd; public static DependencyProperty ResizeWithGripProperty = DependencyProperty.Register("ResizeWithGrip", typeof(bool), typeof(BorderlessWindowBehavior), new PropertyMetadata(true)); /// <summary> /// Gets or sets a value indicating whether [resize with grip]. /// </summary> /// <value> /// <c>true</c> if [resize with grip]; otherwise, <c>false</c>. /// </value> public bool ResizeWithGrip { get { return (bool)GetValue(ResizeWithGripProperty); } set { SetValue(ResizeWithGripProperty, value); } } /// <summary> /// Called after the behavior is attached to an AssociatedObject. /// </summary> protected override void OnAttached() { if (AssociatedObject.IsInitialized) AddHwndHook(); else AssociatedObject.SourceInitialized += AssociatedObject_SourceInitialized; AssociatedObject.WindowStyle = WindowStyle.None; AssociatedObject.ResizeMode = ResizeWithGrip ? ResizeMode.CanResizeWithGrip : ResizeMode.CanResize; base.OnAttached(); } /// <summary> /// Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred. /// </summary> protected override void OnDetaching() { RemoveHwndHook(); base.OnDetaching(); } /// <summary> /// Adds the HWND hook. /// </summary> private void AddHwndHook() { m_hwndSource = HwndSource.FromVisual(AssociatedObject) as HwndSource; m_hwndSource.AddHook(HwndHook); m_hwnd = new WindowInteropHelper(AssociatedObject).Handle; } /// <summary> /// Removes the HWND hook. /// </summary> private void RemoveHwndHook() { AssociatedObject.SourceInitialized -= AssociatedObject_SourceInitialized; m_hwndSource.RemoveHook(HwndHook); } /// <summary> /// Handles the SourceInitialized event of the AssociatedObject control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> private void AssociatedObject_SourceInitialized(object sender, EventArgs e) { AddHwndHook(); } /// <summary> /// HWNDs the hook. /// </summary> /// <param name="hWnd">The h WND.</param> /// <param name="message">The message.</param> /// <param name="wParam">The w param.</param> /// <param name="lParam">The l param.</param> /// <param name="handled">if set to <c>true</c> [handled].</param> /// <returns></returns> private IntPtr HwndHook(IntPtr hWnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled) { IntPtr returnval = IntPtr.Zero; switch (message) { case WM_NCCALCSIZE: /* Hides the border */ handled = true; break; case WM_NCPAINT: { if (Environment.OSVersion.Version.Major >= 6) { var m = new MARGINS { bottomHeight = 1, leftWidth = 1, rightWidth = 1, topHeight = 1 }; DwmExtendFrameIntoClientArea(m_hwnd, ref m); } handled = true; } break; case WM_NCACTIVATE: { /* As per http://msdn.microsoft.com/en-us/library/ms632633(VS.85).aspx , "-1" lParam * "does not repaint the nonclient area to reflect the state change." */ returnval = DefWindowProc(hWnd, message, wParam, new IntPtr(-1)); handled = true; } break; case WM_GETMINMAXINFO: /* From Lester's Blog (thanks @aeoth): * http://blogs.msdn.com/b/llobo/archive/2006/08/01/maximizing-window-_2800_with-windowstyle_3d00_none_2900_-considering-taskbar.aspx */ WmGetMinMaxInfo(hWnd, lParam); handled = true; break; } return returnval; } } } </window>