Sales Analytics – 3 important metrics to track

Sales Analytics – 3 important metrics to track.

  1. Lead Scores: Score your leads on a scale of 1 to 100. Potential buyers with fewer than 65 points are “prospects”; potential buyers with more than 65 points are “leads”. The higher the number of points, the hotter the lead.
  2. Lead Conversion Metrics: What percentage of new leads (referral, inbound, website, advertisement, outbound) turn into qualified opportunities? What percentage of these qualified opportunities convert to closed deals?
  3. Pipeline Metrics: How much new pipeline opportunities (in dollars) are you generating every month? What percentage of pipeline opportunities are from proven campaigns, cold calling or other sales techniques you deploy?

Sales Analytics is an important component of Growth Analytics. Read the full article @ Growth Analytics.

Posted in Fast Growing Companies, Growth Analytics | Tagged , | Leave a comment

How fast do fast growing companies grow?

How fast is fast growth? growth

Looking at Inc. 5000 list of fastest growing private companies in USA, the top 10 companies have grown more than 200 times in last 3 years. 200 times!!

There are 100 private companies in the USA which have grown more than 35 times in last 3 years.

There are 3300 companies in 2015 list of Inc. 5000 fastest growing companies that have more than doubled in last 3 years.

Get the complete study at Fastest Growing Companies.

Over the past few years, TechFerry has helped many companies with Growth Analytics. We can help put your business on Fast Growth track. Talk to TechFerry!!

Posted in Fast Growing Companies, Growth Analytics | Tagged , , | Leave a comment

Analytics of Things (AoT) – Considerations

Analytics of Things (AoT) refers to real time analytics and batch processing of sensor data generated by Internet of Things (IoT) devices. If you are considering an AoT platform, here are the things you should consider.

  1. Massive Scalability: Sensors produce massive amounts of data. Hence, your AoT platform or application must be massively scalable. Please refer to Massively Scalable Applications presentation as scalability is of utmost priority for AoT applications.
  2. Machine Learning/AI: Business Insights are useful. They help businesses hack growth. Algorithms today can crunch numbers and big data, they can self learn, interpret patterns and come up with business insights. Consider how much Machine learning or AI capabilities do you need in your solution?

In addition, you should consider the following questions:

  1. For what duration do we need to store the live stream data? Days, months or years? Sensors produce massive amounts of data. 1 million messages per second fill 1 GB of your storage in a second (assuming 1 message to be of 1KB for simplicity). That fills your 1 TB PCIe flash card (or other hard drive) in just 17 minutes. Though it will be nice to be able to show sensor data in live graphs but limiting data stored can save a ton on hosting fees.
  2. Can sensors send data over plain TCP protocol? Can we avoid the unnecessary overhead of HTTP or REST? How important it is have a web service (HTTP/REST) receive the data?

TechFerry has been involved in the process of helping many clients with AoT, Big data analytics, machine learning, IoT and massively scalable applications in general. If you have questions, please feel free to Talk to TechFerry.

Posted in AoT, IoT | Tagged , | Leave a comment

Are product user-guides a history now?

Who taught us how to use facebook? In fact, who taught our parents on how to use facebook? Where is the user-guide on how to search on google?

Your customers who use facebook and google almost daily – will they hate reading long cumbersome help text? Do you like searching on product’s website when you can not figure out how to accomplish the task you are trying to do? How often do you quit watching a 10 minute long video on how to use a product?

TechFerry has worked and improved usability of many software products for many of our clients. In the process, we learned a lot about common mistakes, generated ideas on how to improve usability and implemented those for our clients. If you are interested, you can download our FREE eBook on Usability – Beyond RIA which captures specific examples for usability improvement from the industry.

  Usability - Beyond RIA Usability – Beyond RIA

Usability, though a frequently used term but is the least understood in the industry. This report highlights how a magnificently designed product/solution can still make users struggle to achieve even the simple desired objectives.This report is NOT an academic study, rather it share experiences on Usability with examples and implementations from software industry. It talks about gaps between user expectations and their actual interactions with products.

Posted in Ext-JS Sench Touch | Tagged , , , | Comments Off on Are product user-guides a history now?

Sencha Touch Performance Improvement Tips

A website designed for desktop browsers can take up to 40 seconds to load on mobile devices. Your Sencha Touch application if not built and deployed properly may take more than a minute to load – a far cry from an optimized mobile site. If your Sencha Touch mobile app is taking too long to load on a mobile device, here are a few things you can consider to improve the performance.

  1. Use Sencha Build tool to package all required JS files (views, stores, models) and compress them in one app-all.js file.
  2. Test your site with Firebug or Chrome Developer tool/Ripple to make sure that no more JS requests are going to server; if there are, consider using Ext.require() or adding these JS files in models, views, stores config parameters in your application/app.js and build again. This will ensure that loading and rendering is fast.
    Ext.require(['Ext.data.proxy.Rest',
                 'Ext.dataview.NestedList',
                 'Ext.TitleBar'
                ]);
    
    Ext.application({
          name: 'MyApp',
          views: ['View1', 'View2'],
          models: ['Model1','Model2'],
          stores:['Store1','Store2'],
          launch: function() {
             // Do your stuff here.
          }
    });
  3. Look out for other CSS or JS files and make sure all of them are compressed. You can use YUI compressor.
  4. Make sure you are using smaller sized images. You can also consider using an image cruncher to cut back on image size. For videos, consider embedding YouTube videos rather than streaming video yourself.
  5. If your app is sending too many requests to server (using Store loads or via Ajax/REST), consider fetching the data in JSON format inside your JSP/PHP script response itself. You can then load the stores and display information from locally available data. Avoid sending too many AJAX/REST requests to server to get simple information like user/organization name, branding params etc.
  6. Destroy components that are not visible on the screen anymore. Avoid too much nesting of panels. Try to keep your DOM size smaller.
Posted in Ext-JS Sench Touch | Tagged , , | Leave a comment

ExtJS grid panel with remote sorting and pagination using Hibernate

This blog post talks about setting up ExtJS grid panel for remote sorting and pagination at server side. For our example below we are using JEE technologies like Hibernate for server side sorting and pagination. We are using Jersey to serve RESTful web services and Spring as IOC container and for bean management. The data will be converted from Data Object to JSON and vice versa using JAXB and raw JSON objects.

Let us take a look at what we are trying to build. It is an ExtJS grid panel that lists all companies. Please note the docked pagination toolbar at the bottom of the snapshot. Also, the results are sorted by Company name in ascending order. The pagination and sorting is being done remotely at server side using Hibernate as we will learn below.

ExtJS grid example

Let us start by defining ExtJS Store. We will set up a REST based proxy which will load the list in JSON format. Set ‘remoteSort’ config parameter to ‘true’, this will defer sorting operation to server. Its default value is false which means that the sorting is done locally at client side. We can specify the collection of sorters to be applied to this store using the ‘sorters’ property. Also, let us specify ‘pageSize’ config parameter to 5. ‘pageSize’ is the number of records to be shown on a page. autoLoad: {start: 0, limit: 5} means the store will be loaded automatically after creation. It will get records from the starting index at 0 and limit number of records to 5.

Ext.define('Crm.store.Companies', {
    extend: 'Ext.data.Store',
    requires: 'Crm.model.Company',
    model: 'Crm.model.Company',
    autoLoad: {start: 0, limit: 5},
    pageSize: 5,
    remoteSort: true,
    sorters: [{
                  property : 'name',
                  direction: 'asc'
              }],
    proxy: {
        type: 'rest',
        url : 'service/companyList/json',
        reader: {
            type: 'json',
            root: 'companyList',
            totalProperty: 'total'
        }
    }
});

Let us now look at CompanyList view. It is an ExtJS grid panel and will be placed at the center of our viewport (border layout). Notice the docked paging toolbar at the end. It points to the same store as does our ExtJS view.

Ext.define('Crm.view.CompanyList', {
    extend: 'Ext.grid.Panel',
	alias: 'widget.companyList',
	store : 'Companies',
	title : 'Company List',

	initComponent: function(){
		this.columns = [ {
			text : 'Name',
			width : 150,
			dataIndex : 'name'
		}, {
			text : 'Status',
			width : 150,
			sortable : false,
			hideable : false,
			dataIndex : 'status.name'
		}, {
			text : 'Employee Strength',
			width : 150,
			sortable : false,
			hideable : false,
			dataIndex : 'companyDetail.employeeStrength'
		}, {
			text : 'Notes',
			flex : 1,
			sortable : false,
			hideable : false,
			dataIndex : 'companyDetail.notes'
		} ];
		this.dockedItems = [ {
			xtype : 'pagingtoolbar',
			store : 'Companies',
			dock : 'bottom',
			displayInfo : true
		} ];
	        this.callParent();
	}
});

What you see on the ExtJS grid snapshot above is page 2 of 5. Our autoLoad config settings will load page 1 by default. Clicking on next page button in the docked toolbar will take you to page 2. Here is how the request parameters are sent by browser to the server when we request page 2.

limit	5
page	2
sort	[{"property":"name","direction":"asc"}]
start	5

Clicking on name property will sort companies in descending order. The modified sort parameter in request looks like this:

sort	[{"property":"name","direction":"desc"}]

Let us now look at the Hibernate method that performs the actual sorting and pagination. The input parameters are ‘start’ and ‘limit’ for pagination. It also uses sort properties for sorting the results.

public List list(int start, int limit, String sortProperty, String sortDirection) {
  List list = sessionFactory.getCurrentSession()
      .createQuery("from Company order by " + sortProperty + " " + sortDirection)
      .setFirstResult(start).setMaxResults(limit).list();
  return list;
}

Let us now look at the RESTful Web Service method implemented using Jersey and JAXB to produce the results for ExtJS grid in JSON format. We have used raw JSON objects to parse ‘sort’ request parameter which is also in JSON format. This Jersey based web service method calls service layer which in turn calls DAO layer which contains the Hibernate code listed above.

  @GET
  @Produces("application/json")
  @Path("companyList/json")
  public CompanyList getJSON(@QueryParam("start") int start,
      @QueryParam("limit") int limit, @QueryParam("sort") String sort) {

    JSONArray array = new JSONArray(sort);
    JSONObject obj = array.getJSONObject(0);
    String sortProperty = (String) obj.get("property");
    String sortDirection = (String) obj.get("direction");

    CompanyList list = new CompanyList(companyService.listCompanies(start,
        limit, sortProperty, sortDirection));
    list.setTotal(companyService.countCompanies().intValue());

    return list;
  }

The focus of this blog post is ExtJS grid panel and how to set it up for remote sorting and pagination using Hibernate. You can learn more about server side code in our Annotations tutorial.

We will be happy to resolve any queries you may have. Please leave us a reply or comment below.

Posted in Ext-JS Sench Touch, JEE, Spring-Hibernate | Tagged , , | 4 Comments

Ext-js Deployment – Sencha SDK Tools Correct Usage

If you are new to Ext-JS applications deployment and if you are using Sencha SDK tools, there are a number of things that you need to do correctly to produce correct jsb3 and app-all.js and all-classes.js files.

This blog lists a number of errors you may get while using Sencha SDK tools for Ext JS deployment. We have used SDK tools version 1.2.3 while creating this blog entry.

  1. undefined:0 TypeError: ‘null’ is not a constructor” and it then hangs for ever
  2. undefined:0 ReferenceError: Can’t find variable: Ext
  3. Stream: “Could not open the pipe” (exec://java -jar
  4. Everything works but jsb3 files does not include any js files and app-all.js file is blank


1. undefined:0 TypeError: ‘null’ is not a constructor
This error comes when you are using index.html and not the URL deployed on a server.
Do not use the following:

sencha create jsb -a index.html -p app.jsb3

instead use the following command:

sencha create jsb -a http://localhost/yourApp/index.html -p app.jsb3

2. undefined:0 ReferenceError: Can’t find variable: Ext
This error may come if there is a typing mistake in the URL you have specified.

sencha create jsb -a http://localhost/yourApp/index.html -p app.jsb3

Check that your URL ‘http://localhost/yourApp/index.html’ is correct by typing it in a browser. Make sure that your application Context (yourApp) is correct, the file name is index.html and this file exists in your context folder.

3. Stream: “Could not open the pipe” (exec://java -jar
This issue is normally reported while using 64 bit JRE and during sencha build command execution.

sencha build -p app.jsb3 -d .

You can install 32 bit JDK/JRE too. In your command prompt and before running your sencha commands, set your path variable to include your 32 bit JRE.


4. Everything works but jsb3 file does not include any js files and app-all.js file is blank
If both sencha create and sencha build commands are working but your jsb3 file does not include Ext-js or your app js files; and newly created all-classes.js and app-all.js are there but they does not contain anything. Please make sure that you have the following things right.

Is your folder structure exactly same as recommended in ExtJS doc or have you changed something?

Ext-JS Folder Structure

  1. Please make sure that your index.html and app.js are in same folder. You may prefer to keep your html files and js files in separate folder and this may have caused your deployment process to fail.
  2. Also make sure that you are using Ext.Application() and not trying deployment tools on Ext.onReady().
  3. Have you changed your app folder name with your application name? If yes, please make sure to specify the correct path in Ext.Loader configuration.
    Ext.Loader.setConfig({
    	enabled : true,
    	'YourAppNameSpace': 'YourAppFolderName'
    });
    Ext.application({
    name: 'YourAppNameSpace',
    appFolder: 'YourAppFolderName',
    //...
    });

    Your app may run fine if you have specified your App Folder name only in Ext.application but you may need the Ext.loader configuration for your deployment commands to work.

Happy Ext-js Deployment! If you face any further issues (or if you have resolved other issues), you can share the details in the comments section.

Posted in Ext-JS Sench Touch | Tagged , | 4 Comments

Ext JS Panel Content – fetch HTML via Ajax

How to fetch Ext JS Panel’s content HTML from Server using Ajax?

Sometimes, you may want to populate an Ext-JS Panel with HTML content generated at server side (using JSP, PHP or any other server side view technology). This enables you to use existing server side views and embed them in Ext-js Panels or other components. You can do that using Ajax as shown in code snippet below.

Ext.Ajax.request({
  url: 'company/create',
  success: function(response){
	var htmlText= response.responseText;
	//Get the Panel component using its id
	var companyPanel = Ext.getCmp('companyPanel');
	// update the panel content's with 
        // HTML response from Ajax call
	companyPanel.update(htmlText, true);
  }
});
Posted in Ext-JS Sench Touch | Tagged , | Leave a comment

Annotation Tutorial

Check out our 5-part Annotations Tutorial.

Annotation Tutorial: Contents
JEE Annotations

Posted in JEE, Spring-Hibernate | Tagged , , , , , | Leave a comment

About TechFerry

Learn about TechFerry.

 

For more details, please visit http://www.techferry.com/.

Posted in News | Tagged | Leave a comment