# 12 Mart 2007 Pazartesi
I was using a private SVN for ActiveWriter and thanks to Hammet, the source is now available through Castle Contrib Repository.
Having source on an open repository is great. AW now has it's own Ohloh page :)
  • Codebase: 27,938 LOC (Most of them generated by DSL Tools, actually:)
  • Effort (est.): 7 Person Years
  • Project Cost: $362,806
I feel good! :)

posted on 12 Mart 2007 Pazartesi 10:11:10 UTC  #   
# 08 Mart 2007 Perşembe

I was doing a code review for a client and something like the following was everywhere:

    command.CommandText = "EXEC ManageBlogs;2 '" + blogName + "'";


Yes, they don't use parametrized queries. They don't even mark the command as a SP but that's the usual bad practice I happen to see everywhere. But what the heck ";2" stands for? I remember reading something like that, let's fire Books Online for Create Procedure statement (T-SQL 2000, which my client use):

CREATE PROC [ EDURE ] [ owner. ] procedure_name [ ; number ]


Is an optional integer used to group procedures of the same name so they can be dropped together with a single DROP PROCEDURE statement. For example, the procedures used with an application called orders may be named orderproc;1, orderproc;2, and so on. The statement DROP PROCEDURE orderproc drops the entire group. If the name contains delimited identifiers, the number should not be included as part of the identifier; use the appropriate delimiter around procedure_name only.

...and here's the 2005 version:

CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]
; number

Is an optional integer that is used to group procedures of the same name. These grouped procedures can be dropped together by using one DROP PROCEDURE statement. For example, an application called orders might use procedures named orderproc;1, orderproc;2, and so on. The DROP PROCEDURE orderproc statement drops the whole group. If the name contains delimited identifiers, the number should not be included as part of the identifier; use the appropriate delimiter around only procedure_name.

Numbered stored procedures have the following restrictions:

  • Cannot use xml or CLR user-defined types as the data types.

  • Cannot create a plan guide on a numbered stored procedure.


This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

I believe this is something from the archaic days when all the development happened on the DB, that's why SP's for in the first place, isn't it? I even bet this is a fossil syntax leftover from the Sybase SQL days. Good to see that this will be dropped, but it should have already been with SQL 2005.

So, what was my client thinking? Since they use SP's extensively, they use this as a method overload. SP name stands for the static class and the number is something like different methods to call. They use 1 for INSERT, 2 for SELECT and 3 for DELETE and so on.


    @Name varchar(50)


    INSERT INTO Blogs (blog_name) VALUES (@Name)





    SELECT * FROM Blogs




    @Id int


    DELETE FROM Blogs WHERE blog_id = @Id



Exec ManageBlogs -- Error


Exec ManageBlogs 'MyBlog' -- Executes ;1


Exec ManageBlogs;1 'MyBlog' -- Executes ;1


Exec ManageBlogs;2 -- Executes ;2


Exec [ManageBlogs];2 -- Executes ;2


Exec [ManageBlogs;2] -- Error

Total chaos :) And I was quick to find ;1's that don't insert in some SP's, so they broke their own rules already.

VS 2005 designer picks up only the first one:

Hey, even Management Studio doesn't support numbered SP's:

I believe I have enough evidence to to convince my client that this is pure evil :)
posted on 08 Mart 2007 Perşembe 10:46:34 UTC  #   
# 30 Ocak 2007 Salı
Last week, Edward Bakker started summarizing some notes and resources on Software Factories, then Jezz Santos added this one on "When would you build one". (Their latest posts have a cyclic dependency, by the way :) I don't know if people (apart from these two guys. They're already into it to their neck :) are more talkative on SF notion lately or my doors of perception are more open to this kind of posts since I'm trying to build one myself, but I started seeing more and more on this subject.

I remember seeing a discussion between Grady (an IBM Fellow, as his blog says) and Greenfield, Cook, Wills and Kent on the UML vs SF kind of debate (and I assure you I didn't have a clue back then how important things they're talking on). Then I interested in code generation. Then I had to use NHibernate for a little project. Then I wanted to generate .hbm.xml documents in VS. Then I thought I prefer attribute decorations rather than XML declarations. Then I found out DSL Tools in this post (Sequence ended in mid 2006. Quite late for me, huh?).

Now, with DSL Tools in hand, I feel like I can take over the world :) Seriously, check the comments for this post. People want tools for their everyday needs. Put some guidance in, integrate with the IDE and they're willing to do the rest. Learning curve might be a little steep but anybody dreaming a tool to generate some code or project instruments or a custom domain intelligent enough to do some repetitive / predefined work may start building it right now or use existing ones, be it DSL Tools, GAT / GAX or one of the available software factories.

posted on 30 Ocak 2007 Salı 00:23:29 UTC  #   
# 29 Ocak 2007 Pazartesi
It sometimes get frustrating when you debug your project through another instance of Visual Studio, especially if you manipulate the "active" DTE within your debug project. I somehow ended up to the following when getting a reference to DTE:


It worked most of the time, but "not all the time" means you may add a project to the solution where your code resides (the parent VS instance), rather than where the debugging session is. So, after some research, DTE code turned into this:


public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot);


public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc);


public static DTE GetDTE(string processID)


    IRunningObjectTable prot;

    IEnumMoniker pMonkEnum;


    string progID = "!VisualStudio.DTE.8.0:" + processID;


    GetRunningObjectTable(0, out prot);

    prot.EnumRunning(out pMonkEnum);



    IntPtr fetched = IntPtr.Zero;

    IMoniker[] pmon = new IMoniker[1];

    while (pMonkEnum.Next(1, pmon, fetched) == 0)


        IBindCtx pCtx;

        CreateBindCtx(0, out pCtx);

        string str;

        pmon[0].GetDisplayName(pCtx, null, out str);

        if (str == progID)


            object objReturnObject;

            prot.GetObject(pmon[0], out objReturnObject);

            DTE ide = (DTE)objReturnObject;

            return ide;




    return null;


posted on 29 Ocak 2007 Pazartesi 22:17:43 UTC  #   
I was trying to solve the Custom Tool property issue with .actiw files in ActiveWriter, as suggested by Bogdan Pietroiu months ago, and spent a clear hour trying to figure how to inject my own registry keys into WiX setup project of DSL Tools. I modified the .vstemplate for .actiw files to include the following:



  <CustomParameter Name="$itemproperties$" Value="CustomTool" />

  <CustomParameter Name="$CustomTool$" Value="ActiveWriterCodeGenerator" />



and thought that the file, when added to the project, will have Custom Tool property already set. I was appearently wrong (documentation says it should work).

Bogdan's suggestion was to have a key named after the file extension under Generators\{Language}, and I manually confirmed that it works great. So, how to automate the process of adding this reg key through the setup? WiX Toolkit documentation shows the way, so I copied Registry.wxs to have my own key registered.

<?xml version="1.0" encoding="utf-8"?>

<Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'>

  <Fragment Id="CustomToolFragment">

    <FeatureRef Id="DefaultFeature">

      <ComponentRef Id="_ActiveWriterCTReg" />


    <DirectoryRef Id="TARGETDIR">

      <Component Id="_ActiveWriterCTReg" Guid="{some GUID}">

        <Registry Root='HKLM' Key='Software\Microsoft\VisualStudio\8.0\Generators\{164b10b9-b200-11d0-8c61-00a0c91e29d5}\.actiw' Id='{some GUID}' Type='string' Value='ActiveWriterCodeGenerator' />

        <Registry Root='HKLM' Key='Software\Microsoft\VisualStudio\8.0\Generators\{fae04ec1-301f-11d3-bf4b-00c04f79efbc}\.actiw' Id='{some GUID}' Type='string' Value='ActiveWriterCodeGenerator' />





<Registry> elements define the key to be added, as you may have guessed. Anyway, although I changed the build action on the .wxs and although it seems that Candle and Light picked up the file, the installer didn't add the registry key. So? Orca to the rescue. You should check Component and Registry tables in .msi file to check if your key slipped in, and Orca shows them quite detailed. In my case, though, it shows the absence of my additions.

Long story (not so) short, it seems that I should examine Registry.tt as the first step, but didn't. To include your ComponentRef in DefaultFeature, you should have your Fragment as FragmentRef in Main.wxs . So, you should add each of your custom fragment in the list defined in customFragmentIds in InstallerDefinitions.dslsetup as shown below:

<installerDefinition xmlns="http://schemas.microsoft.com/VisualStudio/2005/DslTools/InstallerDefinitionModel"



I hope this info helps someone.

posted on 29 Ocak 2007 Pazartesi 21:13:31 UTC  #   
# 08 Aralık 2006 Cuma

At work, I'm devoting a fair amount of my time to SQL BI concepts lately. One of the exciting concepts (there are many, believe me) of SSAS on SQL 2005 is Key Performance Indicators. A KPI is the creme de la creme of all the data aggregations. It's the final display of knowledge extracted from the vast amount of data to answer questions like "Based on such and such criteria, are we profitable?".

Since KPIs are mostly for non-techies, it's best to display them in a dashboard like scenario, where SharePoint is a good example. A handy newcomer in dashboard scene is Vista Sidebar, and displaying KPI data on the Sidebar was the most logical exercise for Sidebar development for me with the release of Vista:

Without perfecting that, WPF/E came out and I wondered if I can display KPIs in a Sidebar gadget using WPF/E. Result? I CAN'T. I don't know if it's the security settings or is it the WPF'E engine's fault but, the javascript method in Loaded event does not get called for a .xaml file if it's run in a Sidebar.

<Canvas xmlns="http://schemas.microsoft.com/client/2007"
  <Canvas x:Name="kpiCanvas" />

Here's the code for the WPF/E thing (gadget? applet? app?). Note that, everything's fine in IE:
KPIDS.rar (7.21 KB)

  • WPF/E currently doesn't like .gif images in IMAGE tags. <Image Source="star.png" /> is fine but  <Image Source="star.gif" /> fails without an error, or it's the case for me.
  • I lost (accidentally overriden) the source for KPI sidebar gadget (the one without WPF/E, two images above) but you can easily build one from the given source. Change "createKPI" in kpiLibrary.js to render to html instead of xaml.
  • createFromXaml is a nice method but, we'll have programmatic access to the object model won't we?
  • Although the current form of WPF/E is nice, I won't touch another CTP of it untill I can code in C# against it. JavaScript is sooooo boooring.
  • Follow the steps below to setup remote XMLA access to SSAS through web services. It's required to access KPI data remotely:
    Configuring HTTP Access to SQL Server 2005 Analysis Services on Microsoft Windows Server 2003.
posted on 08 Aralık 2006 Cuma 23:00:36 UTC  #   
# 01 Kasım 2006 Çarşamba
Go visit www.castleproject.org and get the lates bits.

The amount of information there is increadible, MonoRail getting started docs are extremely helpful for me. After seeing "Getting Started with ActiveRecord" topic, you will have no excuse not to use ActiveRecord in your next project. And API documentation is just what I need for ActiveWriter's properties window documentation :)

The question is, will I manage to release something new with ActiveWriter to celebrate the Castle release and the hard work these guys doing? Let's see:

Although implementing the toolwindow above turned out to be harder than I thought, I was actually referring to generics support in ActiveWriter, which is still waiting my attention. So, I'll try to hurry++ and sleep--;
posted on 01 Kasım 2006 Çarşamba 19:58:57 UTC  #   
# 11 Ekim 2006 Çarşamba
I can't dechiper legal documents even in Turkish, how can I decide if I'm allowed to release the source code or not by looking at the VS DSK license? If Microsoft has a department or something to ask "would you get angry if I release this?", I want to know.

Anyway, you can download the source of ActiveWriter Preview here. I have removed some .tt files copyrighted by Microsoft, but instructions are available in the download to add them from an empty DSL Tools project. Lack of .tt files will prevent any "just extract and open" scenario, sorry about that.

Back to the license adventure. I have asked in DSL Tools forum if it's possible to release the source, and directed to the SDK license. Then I found a post on Interop blog, saying that "It is possible to release extensions to Visual Studio under open source licenses" with an IANAL notice. I have convinced that I can, until I notice copyright notes on all over the .tt files, which are very much the core of the code generation on DSL Tools part. So I followed the next best approach, removed copyrighted stuff.

Having copyright notices in .tt files, for Microsoft, is a bit silly, by the way. They don't include notices in AssemblyInfo or config files (or any other template generated solution files), what's different with .tt's?


Gareth Jones from DSL Tools team replied, saying that .tt files are considered to be samples and developers may customize them with whatever license statements they have. This is extremely good. I'll re-release the source with all the .tt files included.

And for those who don't know what a .tt file is for; they are input files for the text templating engine of DSL Tools. They have ASP.NET like <# #> syntax to generate output as VS solution files. Very handy, but I prefered a more classic approach in ActiveWriter. CodeGenerationHelper is much nicer in plain C# than .tt syntax.

ActiveWriterReport.tt file:

<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" debug="true"#>
<#@ output extension=".%EXT%" #>
<#@ ActiveWriter processor="ActiveWriterDirectiveProcessor" requires="fileName='%MODELFILE%'" #>
<#@ import namespace="Altinoren.ActiveWriter.CodeGeneration" #>
    CodeGenerationHelper helper = new CodeGenerationHelper(this.Model, "%NAMESPACE%");

and the usage:

protected override byte[] GenerateCode(string inputFileName, string inputFileContent)


    ResourceManager manager =

        new ResourceManager("Altinoren.ActiveWriter.VSPackage",

                            typeof (ActiveWriterTemplatedCodeGenerator).Assembly);

    FileInfo fi = new FileInfo(inputFileName);

    inputFileContent =

        manager.GetObject("ActiveWriterReport").ToString().Replace("%MODELFILE%", fi.Name).Replace(

            "%NAMESPACE%", FileNameSpace).Replace("%EXT%", "cs"); // TODO: Get file extension from the project model


    byte[] data = base.GenerateCode(inputFileName, inputFileContent);

    return data;


posted on 11 Ekim 2006 Çarşamba 09:59:00 UTC  #   
# 30 Eylül 2006 Cumartesi

Help and download available here.

If you missed the announcement, it is a visual designer, an addin for Visual Studio 2005, to design a domain model and to generate code decorated with ActiveRecord attributes.

Please send bugs, suggestions and feature request through the Navigation pane of the site.

Thanks To

ActiveRecord team for the great and well supported library, NHibernate and Hibernate community for making this chain-reaction possible, Microsoft DSL Tools team for making DSL modelling this easy, everyone at DSL Tools forum, and my wife Damla for her patience.

Pluralization code is simplified version of Damian Conway's algorithm in paper An Algorithmic Approach to English Pluralization
Server Explorer integration greatly inspired from Ted Glaza's post here.
posted on 30 Eylül 2006 Cumartesi 18:12:03 UTC  #