Thursday, December 13, 2012

BizTalk Server 12th Birthday


Happy Birthday BizTalk Server 12/12/2012 Born on 12/12/2000
A Many more returns of the day for BizTalk Server ... The first version of the product "Microsoft BizTalk Server 2000" was released back in 12/12/2000

BizTalk Summit 2012 is happening in Redmond, Seattle on 10th and 11th of December 2012 .The main objective of the event is to show the roadmap, future direction of BizTalk and to highlight what’s coming in the upcoming BizTalk Server 2013 version and improvement that’s happening on the integration side in Windows Azure.

Some good news about BizTalk Server. In Scott Guthrie, Vice President, Microsoft developer division key note, he has mentioned that the "Microsoft is heavily investing on BizTalk Server".
But I did not get, What is the roadmap for BizTalk server beyond 2013

More about the summit please read here . 

But where Microsoft is investing ???

Wednesday, December 05, 2012

Business Intelligence - Part 1 - Date/Time Dimensions, Table Design for periodic aggregate reports

Introduction


Often we end in scratching our head for writing SQLs for a report, where we finally end up writing few SQL in the loop and make a final report. There are age old techniques to achieve that, while we miss the view in doing that.

Sometimes single query could solve our issue in much faster approach than the queries in loop.

Going in search of knowledge of such options I have ended up in learning Data Warehouse and Business Intelligence. The primary approach would be to take baby steps one by one and to reach the destination.

Problem:

What we have:

It is a small store with sales data, what we have is just products, sales invoice and invoice items.


What we need:

Simple intelligence reports

  1. Sales per day of the provided month
  2. Sales per day of the provided week
  3. Sales per quarter of the provided year
  4. Sales per year overall
  5. and more if possible

Solution

Introduce date and time dimensions


Add new dimension tables as above, these tables help to give more business related information like weekday name like Monday, Tuesday, or the quarter of the year Q1, Q2,Q3,Q4 etc.,

The date dimension should have the date_key as long value like 20091125 to map a 2009, November 25th.
Having this as a numeric field like long will help the joins to be faster. Each other table columns are expected to repeat the values in detail. year as 2009, month as 11, day_of_month as 25 etc. We could add more columns as much as needed to provide the business reports.

The time would have a fixed 24 x 60 entries of 1440. If in case we need a second based match, we may need to have 86400 records, but better to avoid second level reporting as it is not required for the store management.

Introduce dimension mapping columns

Add the dimension mapping columns in the invoice for the invoice date, which will have invoice_date_key and invoice_date_time_key.

Both would have numeric values like 20091125 and 1429.

Write the queries.

1. Sales per day of the provided month

SELECT dd.day_of_month, SUM(invoice.total_amount) FROM invoice
RIGHT OUTER JOIN dim_date  dd ON dd.date_key = invoice.invoice_date_key
AND invoice.invoice_date BETWEEN 'x' AND 'y'
GROUP BY dd.day_of_month
ORDER BY dd.day_of_month

The above would result something like
1 $100
2 $90
3 $2000
4 $1200
5 $600
etc...

1.1 Sales per day of the per month, for provided year



SELECT dd.month_short_name_en, dd.day_of_month, SUM(invoice.total_amount) FROM invoice
RIGHT OUTER JOIN dim_date  dd ON dd.date_key = invoice.invoice_date_key
AND invoice.invoice_date BETWEEN 'x' AND 'y'
GROUP BY dd.month, dd.day_of_month
ORDER BY dd.month, dd.day_of_month



The above would result something like
Jan 1 $100
Jan 2 $90
Jan 3 $2000
...

Feb 1 $110
Feb 2 $20
Feb 3 $1000

Feb 4 $1200
Feb 5 $600
etc...


The join with the dimension can be varied and more grouping and aggregation can be done to form variety of reports in a single query, which could impress the business.


    Tuesday, December 04, 2012

    J2EE Web Application Deployment setup for Development in JBoss AS 7.1

    Deploying a J2EE web application is very easy in JBoss AS 7.1.x server. Make your J2EE application as a war file, login to JBoss admin console, in Manage Deployments area, you can upload the war file and Enable it to make it deployed. But, is it possible to keep the deployment process like this while you are developing an application? Certainly not. This process will consume lot of time to see the development changes working.

    This post will help you to setup the deployment process for development in JBoss.

    Instead of deploying the application as a war file, we are going to deploy it as a exploded war directory under <JBoss Home>/standalone/deployments/. This is called exploded deployment, which helps development in greater extent. Follow the steps to get the exploded deployment working,


    • Create a directory with .war suffixed with your application name under   <JBoss Home>/standalone/deployments/ directory.
    • In <JBoss Home>/standalone/configuration/standalone.xml, add auto-deploy-exploded="true"  attribute to deployment-scanner node under deployment-scanner subsystem. 
    • You can also set scan-interval (scan-interval="5000") attribute and set your an interval to the  deployment-scanner node. For example,
                <deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000" auto-deploy-exploded="true" deployment-timeout="1200"/>
    • If the above are done, you have to get the J2EE application contents placed in the deployment directory we have created. It is better to link the output folders to the deployment directory, if you are using an Eclipse based IDE. JBoss will redeploy the application when it finds a change in the code. So all you have to do while development is, do a build when you want to see the code changes working.


    When I was running the application successfully, I noticed that all the cookies from the application is suffixed with . undefined . For example, 

    Ur1bLe3UDdWJ9xm0ZDbMfZvJ.undefined

    this is a bug in JBoss 7.1x and as a workaround, you have to set instance-id attribute in jboss:domain:web subsystem in standalone.xml. For example,

    <subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false" instance-id="myDomain">

    This is not a serious issue, but include the above configuration changes as a good practice. 



    Monday, December 03, 2012

    Dojo + AngluarJS a powerful combination

    For years impressed with Dojo for its complete suite. It was quite sometimg, I started to fall in love with AngularJS for its plain way of working in DOM.

    Dojo's modular code now supports the AMD, which is quite compliant with all the other libraries.

    Normal Dojo page

    <!doctype html>
    <html>

    <head>
        <script src="path/to/dojo/1.7.x/dojo.js" type="text/javascript" data-dojo-config="parseOnLoad: true"></script>
        <script type="text/javascript">
            require(['dijit/form/DateTextBox']);
        </script>
    </head>
    <body>
    <input id="dateBox" data-dojo-widget="dijit/form/DateTextBox"  />
    </body>
    </html>


    AngularJS page



    <!doctype html>
    <html data-ng-app>
    <head>
        <script src="http://code.angularjs.org/1.0.1/angular-1.0.1.js"></script>
        <script type="text/javascript">
            function TestController($scope) {
        $scope.date = new Date();
        $scope.alert = function(msg) {
        $scope.text = msg;
        };
        };
        </script>
    </head>
    <body data-ng-controller="TestController">
          <input id="dateBox" data-ng-model="date2" data-ng-change="alert(date2)" />
          <span id="text">{{text}}</span>
    </body>
    </html>





    Dojo + AngularJS page

    <!doctype html>
    <html data-ng-app="angular-dojo-test">
    <head>
    <link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dijit/themes/claro/claro.css" />
    <script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.js" type="text/javascript"></script>
              <script src="http://code.angularjs.org/1.0.1/angular-1.0.1.js" type="text/javascript"></script>
            <script src="angular-dojo.js" type="text/javascript"></script>
        <script>
       
        function TestController($scope) {
         $scope.date = new Date();
        $scope.alert = function(msg) {
        $scope.date = msg;
        };
        };

        var module = angular.module("angular-dojo-test", ['angular-dojo']);

        </script>
    </head>
        <body class="claro" data-ng-controller="TestController">
        <div>
        <input id="dateBox" data-dojo-widget="dijit/form/DateTextBox" data-ng-model="date" data-ng-change="alert(date)" />
       </div>
       <h1>Date 1: {{date}} </h1>
        </body>
    </html>




    The angular-dojo.js can be found in the github.
    An amazing way to do the JS works

    Saturday, December 01, 2012

    Building JS Graphs, jQuery, Dojo Charts, Google Charts, ExtJS Charts

    Recently in few of the projects there were needs to use Graphs.

    Plenty of them were in race. jQuery jqplot, dojo, extjs.

    jqPlot


    Dojo Charts

    ExtJS



    While the above were good to start with am quite impressed with Google Graphs, Their documentations and simple access to the APIs without complexities.
    Google Charts 

    Google charts is simple easy and quite good with its look and feel and behaviour for applications where we don't need much modifications but just to show data.



    PHP 5.3+ Doctrine2 Schema update script

    I have been working more than 3 years with doctrine, and now started to play with Doctrine 2 for few of my new projects, Its almost a year with Doctrine 2. Here is what it helps the team in development.

    The command line tool to update tables and dump SQLs for upgrades.


    The app uses ZendFramework and Doctrine, here is the small snippet that helps me to run the doctrine commands

    $env = getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development';
    define('APPLICATION_ENV', $env);
     
    define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
    
    set_include_path(implode(PATH_SEPARATOR, array(
        realpath(APPLICATION_PATH . '/../library'),
        realpath(APPLICATION_PATH . '/models/entity'),
        realpath(APPLICATION_PATH . '/util'),
        realpath(APPLICATION_PATH . '/models'),  
        get_include_path(),
    )));
    
    // Doctrine and Symfony Classes
    require_once 'Doctrine/Common/ClassLoader.php';
    require_once 'BaseEntity.php';
    
    $classLoader = new \Doctrine\Common\ClassLoader('Doctrine');
    $classLoader->register();
    $classLoader = new \Doctrine\Common\ClassLoader('Symfony', 'Doctrine');
    $classLoader->register();
    $classLoader = new \Doctrine\Common\ClassLoader('Entities', APPLICATION_PATH . '/models');
    $classLoader->setNamespaceSeparator('_');
    $classLoader->register();
    
    // Zend Components
    require_once 'Zend/Application.php';
     
    // Create application
    $application = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini'
    );
    
    // bootstrap doctrine
    $application->getBootstrap()->bootstrap('doctrine');
    $em = $application->getBootstrap()->getResource('doctrine');
    
    // generate the Doctrine HelperSet
    $helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
        'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
        'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
    ));
    
    \Doctrine\ORM\Tools\Console\ConsoleRunner::run($helperSet);
    
    The above PHP snippet was saved as doctrine.php And the following commands can be used against the database migrations

    > php doctrine.php orm:schema-tool:create
    > php doctrine.php orm:schema-tool:update --force
    > php doctrine.php orm:schema-tool:update --dump-sql
    Trying the following command gives list of other options to perform
    >php doctrine.php

    Friday, November 30, 2012

    Jquery - How to know any changes happen in the form

    At first, I thought initially its a easier task, to find a change happen in a aspx form (Page) . And to my worst there are atleast 30 text box 6 combo and few more ajax grids. I cannot write page full of javascript, whether any changes happened in any of the control.

    It took me another 2 days to get find the solution with Jquery. and amazing just 2 lines of code :)

            //To check if there is any changes happening in the form/page
            $(document).ready(function () {
                $('.bodyContainer').change(function () {
                    // DO YOUR CODE HERE
                        }
                    }

    Few lines above has solved my problem.


    Quick Setup of JBoss 7.1 with MySql Datasource

    This post will help you to setup JBoss AS 7.1.x with MySql Datasource. 

    As a precondition, we should have the following ready in our development environment
    JDK 1.7
    MySql
    JBoss AS 7.x 


    Run JBoss Server
    Once downloaded and extracted JBoss AS 7.1, you can run the server by executing the <JBoss home>/bin/standalone batch (Windows) or shell(Linux) file, based on your OS. Make sure the server got started without any errors by checking the logs. You can also verify by visiting the url http://localhost:8080 in your browser, which shows you the JBoss home page.


    Create User
    We have to create users to access JBoss administration console. To add new users run add-<JBoss Home>/bin/add-user batch (Windows) or shell(Linux) file, based on your OS. This utility requires Realm, Username and Password. Releam is the name of the realm used to secure the management interfaces, by default it is 'ManagementRealm' so you can just press enter. Also enter Username and Password to complete the user creation. Now you can login using the created Username and Password, by clicking the Administration Console link from JBoss home page.


    Setup Datasource
    To setup MySql datasource we have to add MySql driver as a module and create the driver & datasource. Let us get into detail on how to do this. Download MySql Connector Java, jar file and place it in <JBoss Home>/modules/com/mysql/main directory. Create a xml file in the main directory named, module.xml and copy paste the following code in it,


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

    <module xmlns="urn:jboss:module:1.0" name="com.mysql">
        <resources>
            <resource-root path="mysql-connector-java-5.1.18.jar"/>
        </resources>
        <dependencies>
            <module name="javax.api"/>
        </dependencies>
    </module>


    Open <JBoss Home>/standalone/configuration/standalone.xml file to add the MySql driver and create datasource. Find the datasource subsystem(
    <subsystem xmlns="urn:jboss:domain:datasources:1.0">) node in the xml file, and add the following code under drivers node.


    <driver name="mysql" module="com.mysql"/>


    To create datasource, add a new datasource node under datasources node with your MySql database configurations in 
    datasource subsystem. The following is a sample one.


    <datasource jta="true" jndi-name="java:/name-of-the-data-source" pool-name="name-of-the-pool" enabled="true" use-java-context="true" use-ccm="true">

             <connection-url>jdbc:mysql://localhost:3306/db-name</connection-url>
             <driver>mysql</driver>
             <security>
                 <user-name>root</user-name>
                 <password>root</password>
             </security>
             <statement>
                  <prepared-statement-cache-size>100</prepared-statement-cache-size>
                  <share-prepared-statements>true</share-prepared-statements>
             </statement>
    </datasource> 


    Once you are done with the above, restart the server, login to admin console, and click Datasources to view the created datasource. You can use this datasource in your J2EE application to connect to MySql database. 



    Monday, November 26, 2012

    BizTalk 2010: Why WCF Custom adapter is better than WCF-NetTcp, WCF-NetMSMQ ?

    Why WCF custom (In process or isolated) adapter is better than the other WCF adapters. When I discussed with a BizTalk team working for leading apparel client, they have used the custom adapter extensively and they haven’t used any other WCF adapters. I got some answer like
    “For example one of the requirements is to fetch a column from a table which is not a value but a XML message instead. In this case using WCF-custom developer can type poll to have better control on the table column that are fetched.”
     Yes the above statement is true. But it has more reason, after some exploration and I found the following list of usage
    • Implement and exploit extensibility points.
    • Have full access to properties exposed by bindings/behaviors.
    • Enable the use of the bamInterceptor endpoint behavior.
    • Export/Import the binding configuration.
    • Disable a receive location on failure.
    • Run an http-based Receivel Location within an in-process host.
    • Use bindings (e.g. wsDualHttpBinding) for which a WCF Adapter does not exist.
    Not sure, Why we need other WCF adapters like WCF-NetTcp, WCF-NetMSMQ etc. Since WCF-Custom Adapter (Inprocess & Isolated) can do the job?
    Only one use, I can think of , we can quickly configure other WCF adapters than the custom adapters and we don’t require to worry about any other behavior of the service. please comment if you know more reasons

    Exposing BizTalk Service metadata using NetTCP in IIS

    Usually the BizTalk WCF Service Publishing Wizard can expose the metadata using on HTTP Transport. Is it possible to expose in other transport mechanism? The question came to my mind, when I got an opportunity to solve a problem for one of the BizTalk Team facing for quite few days.
     
    The requirement is to publish the BizTalk WCF Service metadata in IIS i.e. the actual Service should be hosted in the BizTalk and the Metadata (Address, Binding, and Contract) should be hosted in IIS. The Critical point is both have to be in the same TCP Transport protocol.
     
    First, the below blog will give you step by step approach to publish the schema as service from the BizTalk application using “BizTalk WCF Service Publishing Wizard”
     
    But now the problem is service and metadata endpoint are in different transport
    Metadata endpoint: http://:/> (This service will be hosted by the IIS)
    Service endpoint : net.tcp://:/ (This service will be hosted by the BizTalk)
    After a day of analyzing various factor, I arrived the following steps to resolve the issue.
     
    Step 01: Configure the receive location as mentioned in the blog
    Step 02: Publish the metadata as usual BizTalk WCF Service Publishing Wizard
    Step 03: In IIS (This is the changes what we have to do)
    01.   Right click on the application -> Manage Application -> Advance Settings. Set the Enabled Protocol as “http,net.tcp” (Update by adding the net.tcp)
    02.   Web.Config changes.
    a.   Add the below configuration in the <system.serviceModel>. This will work only in .Net 4.0. Previous version does not have the capability to hold multiple binding
       <serviceHostingEnvironment >
            <baseAddressPrefixFilters>
                  <addprefix="net.tcp://localhost:808"/> (check the port in the binding of the website. The port has to be same)
               </baseAddressPrefixFilters>
        </serviceHostingEnvironment>
    b.      Add the new metadata endpoint as below
      <endpointname="mexTcpBinding"address="net.tcp://:/WcfServiceOneWay/Service1.svc"binding="mexTcpBinding"bindingConfiguration=""contract="IMetadataExchange" />
     
    Address :  Provide the full path of the metadata service URI.alternative you can set the base address in the config
     
    Now both the service and metadata endpoint are on the same transport
    Service endpoint:  net.tcp:// :/(Hosted by BizTalk)
    Metadata endpoint: net.tcp:// :/(Hosted by IIS)

    BizTalk 2013 Beta is here ... BizTalk is not dead

    Finally Microsoft have not killed the product and with strong note release the Microsoft BizTalk Server 2013 on 05-11-2012. Its an major release from Microsoft.

    The question is Whether the customers are going upgrade to this 2013, Since most of the enhancement is around the cloud

    Some of the key features are

    • Integration with Cloud Services – BizTalk Server 2013 Beta includes new out-of-the box adapters to send and receive messages from Windows Azure Service Bus. It also provides capabilities to transfer messages using different relay endpoints hosted on Azure.
    • RESTful services – BizTalk Server 2013 Beta provides adapters to invoke REST endpoints as well as expose BizTalk Server artifacts as a RESTful service.
    • Enhanced SharePoint adapter – Integrating with SharePoint using BizTalk Server 2013 Beta is now as simple as integrating with a file share. We have removed the need for dependency on SharePoint farms, while still providing backward compatibility.
    • SFTP adapter – BizTalk Server 2013 Beta enables sending and receiving messages from an SFTP server.
    • ESB Toolkit integration – With BizTalk Server 2013 Beta, ESB Toolkit is now fully integrated with BizTalk Server. Also, the ESB Toolkit configuration experience is vastly simplified to enable a quick setup.
    • Dependency tracking - The dependencies between artifacts can now be viewed and navigated in Admin console.
    • Improvements in dynamic send ports – BizTalk Server 2013 Beta provides the ability to set host handler per adapter, instead of always using the default send handler of the adapters



    Note : The above information is taken from the download page (www.microsoft.com/en-us/download/details.aspx)