Aug 18, 2017

jquery / CSS selector - multiple class delimited with space, comma and greater then

When selecting more then one css class in jQuery or CSS stylesheet one must understand the subtle differences. When to use space, comma and greater then.

Let's take a look at this HTML:

<div id="level1" class="parent">
<span id="spanL1">L1</span>
<div id="level2">
<span id="spanL2">L2</span>
<div id="level3" class="child">
<span id="spanL3">L3</span>
Dummy
</div>
</div>
</div>
<div id="level11" class="sibling">
<span id="spanL11" class="child">L11</span>
<div id="level22">
<span id="spanL22">L22</span>
<div id="level33">
<span id="spanL33" class="child">L33</span>
Dummy
</div>
</div>
</div>

Here are jQuery selectors and their effect :

//Hides  L3
$('.parent .child').hide();
//Hides L3 and L33
$('.child').hide();
//Hides L1, L2, L3 & L11 & L33 - makes no sense since class child is contained by class parent
$('.parent, .child').hide();
// Nothing! Since class child is not direct child of class parent
$('.parent > .child').hide();
//Hides L11 since L11 is first child of sibling and L33 is not
$('.sibling > .child').hide();

Bottom line:
- space - Inheritance      ( parent child )
- comma - enumerating   (column1, column2)
- greater then - direct successor  (parent > directChild)

Example for inheritance:
<div class="login2">
<div class="form-group">
        <input type="submit" value="@Lsr("Users.Login.Login")" class="btn btn-primary" />
        <input type="submit" name="ForgotPassword" class="btn btn-link" />

    </div>
</div>

I want to override first CSS selector with second:

.login2 INPUT[type="submit"]:hover {
    background-color: #4B86B7
}

// DOES NOT OVERRIDE!
.login2 .btn .btn-link INPUT[type="submit"]:hover {
    background-color: white
}

//OK !
.login2 .form-group INPUT[type="submit"]:hover {
    background-color: white
}

CSS selector is selected based on more specific selector BUT as you can see winner is parent->child specificity and NOT putting a lot of CSS class on one level together.

JQuery find() vs children() vs filter()

For HTML:

<div id="level1">
<span id="spanL1">L1</span>
<div id="level2">
<span id="spanL2">L2</span>
<div id="level3">
<span id="spanL3">L3</span>
Dummy
</div>
</div>
</div>
: this code:

$('#level1').on('click',function(event){
console.log("level1 click");
$(this).children('span').hide();
});

; will hide only L1 since it is first child of Level1 div.

If instead we use:

$(this).find('span').hide();

; all spans will be hidden.

Filter on the other hand is applied only to already found set of elements.

For example:

$(this).filter('span').hide();

; can't work since filter is applied on single DIV element.
This will work:

$(this).find('span').filter(':first').hide();

Alternative and probably more used is using filter as item iterator :

$(this).find('span').filter(function(index){
console.log($(this).text());
});
});

Javascript - JQuery - DOM event propagation

For HTML:

<div id="level1">
<div id="level2">
<div id="level3">
Dummy
</div>
</div>
</div>

; and event handlers for all div's:

$('#level1').on('click',function(event){
console.log("level1");
});
$('#level2').on('click',function(event){
console.log("level2");
});
$('#level3').on('click',function(event){
console.log("level3");
});

; event click will be first handled in innermost level3 and then bubbled up to its parents.

level3
level2
level1

To prevent event bubbling we use event.stopPropagation();
When placed in level3 other levels wont get executed:

level3

Modern browsers support alternative propagation model - capturing. When writing event handler it must be explicitly specified. Capturing works opposite from bubbling. It first handles outermost elements and then executes all children handlers.

For years I've believed that: event.preventDefault() is preventing event bubbling.
For this href:

<a href="www.google.com">Google</a>

; and event handler:

$('a').on('click',function(event){
event.preventDefault();
console.log("google.com");
})

; it prevents standard browser action for HREF so no redirect happens.

Aug 8, 2017

MS SQL - query optimization tips

General hints

For execution plan graph:

- Find operators with high estimated cost within a query.
- Unless there is no filtering generally table or index SCAN is bad. Maybe you need to provide clustered index.
- Thick lines of data in execution plan maybe bad. Especially if they end up to result.
- Missing index warnings

Table scan - bad
Clustered index scan - better -> occurs when there is no WHERE
Clustered index seek - best -> occurs when there is clustered index

Non-clustered index is same idea. Scan - bad -> seek good.
When creating composite indexes sometimes mere change of places of columns in index will hint SQL to use created non-clustered index and perform Seek.

Observe logical reads. When using seek it should go dramatically down since using B+ tree.

Bottom line is to observe WHERE expression and play with indexes.

Key lookup is bad -> use covering index or included columns index

Use SARGable predicates (WHERE or ON expression etc.)- don't use UDF's or LIKE. If not sure take a look at execution plan. If you have index on columns and Index seek is not used then you are NOT using SARGable predicate Also look for mentioning of RESIDUAL predicate. If it is mentioned in JOIN operators or elsewhere then you are not using SARGable predicate. Optimizer will always try to "push" your predicates on index level and perform seek. These will then be seek predicates.

Execution plan - conversions

When you observe any kind of conversion in "Predicate" section of info for operator (Scan, Seek, Join) you should research. Key problem is that optimizer will NOT use SEEK on existing index but SCAN.
Either you used UDF explicitly or query optimizer concluded it should convert something implicitly.
For example: SELECT Title FROM Books WHERE Id = '112'
Since Id is INT implicit conversion occurs and index cant be used.

UDF functions

Use of system or custom UDF brings performance down. Solution is to create computed column with UDF function and nonclustered index on it.

Use most selective column as first column in index!

Dynamic SQL


sp_executesql - execution plan is cached, parametrized
exec - not cached, not safe

Don't use * in Views !

CREATE VIEW ProductVIEW
AS
SELECT * FROM Product

ALTER TABLE PRODUCT
ADD DUMMY VARCHAR(50)

--Dummy is missing !
SELECT * From ProductVIEW
--Must explicitly refresh view
EXEC sp_refreshview 'ProductVIEW'


SQL Server performance

Activity monitor -> waits & recent expensive queries

Look for blocks and deadlocks.

Columnstore indexes

Introduced in 2012 only as nonclustered. In 2014 added support for clustered.

Use them for scenario with heavy READ and Scan operation. It has penalty for CRUD.
Must be dropped for clustered and recreated.


Logical reads vs physical reads

Logical is accessing pages from memory while physical is reading from HD and is MUCH more expensive. Every logical read is reading one complete page.


Use these two to get exact time and resources used to execute query
SET STATISTICS IO ON/OFF

SET STATISTICS TIME ON/OFF

; primary we use these to measure logical reads.


SET SHOWPLAN_XML ON - useful if you need to search for some text since this dumps in XML.


Usefull toll for SSMS to analyze execution plan:
https://www.sentryone.com/plan-explorer


To get estimated and actual rows returned you can use this:

SET STATISTICS PROFILE ON
....
SET STATISTICS PROFILE OFF

Estimate vs Actual

You want to compare estimates to actual rows returned in order to pinpoint bad statistics on certain database element. This will result in poor execution plan and poor performance.
Frequency of updating statistics can be adjusted to resolve this issue.


UDF's can't be estimated by query optimizer ! They spoil info about time consumed and relative batch. Use SET STATISTICS IO ON instead.

Memory grant

For some operators data has to be cached and extra memory is required. Optimizer tries to estimate and grant memory for operator. Example is Hashed match and Sort. You'll observe this info in SELECT (most left operator). It's not desirable to have under-estimates or over-estimates. Under-estimate for memory can result in accessing TEMPDB and destroy performance. Over-estimate will take too much resources and degrade concurency.

Hashed match, Sort - usual culprit for memory consumption

Helper to list all existing indexes on table:  exec sp_helpindex 'TABLENAME'

Join operator "Nested loop" 

Top (on graph up) is outer table. Each row in outer is iterated over every element on inner, bottom (on graph down). Optimizer will choose optimal (smaller) table (rowset) as outer table. Order of JOIN is IGNORED! There are hints to force order but it's best to ignore them.
This type of join is generally expensive. It happens when optimizer doesn't have optimized sorted input for JOIN so it decides to iterate. Observe both outer and inner table and see if you can create index to cover this join.
Watch for index scan in inner table especially for under-estimate of CE.

Join operator "Merge join"

Generally this is optimal type of join. It's low on memory. Optimizer found indexed, sorted inputs for outer and inner table. Sometimes optimizer may create sorting on the fly to support Merge join. If statistics are ok then its probably the best way to join. If we know better we could force Nested loop. Again better approach is to look at stats and indexes and try to help optimizer instead of forcing join operator.
Watch for spill over in TEMPDB during injected sort.

Cardinality estimation (CE)

In short CE is logic used to calculate query plan based on statistics. CE is one of major differences between SQL versions. Using different compatibility level will probably result in different CE performance.

https://docs.microsoft.com/en-us/sql/relational-databases/performance/cardinality-estimation-sql-server

In practical sense, as above article elaborates, we need to make sure that CE works fine. Put it simply if you observe in estimated query plan estimated rows or memory grant that is way off from actual rows and memory you have problem. Solution is usually in dealing with statistics.

Statistics

SQL is auto-updating stats when CRUD operation happens in these case:

As data changes in your tables, the statistics – all the statistics – will be updated based on the following formula:

When a table with no rows gets a row
When 500 rows are changed to a table that is less than 500 rows
When 20% + 500 are changed in a table greater than 500 rows

Here is how you can show statistics for an index:
exec sp_helpindex 'employee'
go
dbcc show_statistics (employee, 'PK__Employee__7AD04FF17E197905')
go

Here is how you can force full stats rebuild:

update statistics Employee with fullscan

Watch it! Fullscan takes time and resources and it is auto executed during index rebuild.
Never update stats AFTER index rebuild since it will degrade already performed fullscan action during rebuild.

You can turn off, change frequency or sampling size for auto stats.

Good FAQ on stats:

https://www.red-gate.com/simple-talk/sql/performance/sql-server-statistics-questions-we-were-too-shy-to-ask/#1



Sort operator

Query optimizer will try to avoid explicit sorting. Usually it points to problem. Inspect is ORDER BY required and can you create or update existing index to support sorting.
ORDER BY can be very expensive!

Join operator "Hash join"

Memory consuming. So called stop & go operation. Selected for unsorted input. Optimizer assumes that injecting sorting and resorting to nested loop wan't help in overall cost so it resorts to hash match. In first phase on outer table hash keys are created based on row values. Then these hash keys are one by one matched to hashes created on fly in inner table. First phase is called "Build" and second is "Probe".
Watch for "fat" outer table. Optimizer should know to choose proper "thinner" candidate for inner table. If fails look into it.
Also pay attention to spill over to disk. From SQL 2012 you'll see a notification in execution plan.
If you use older versions checkout SQL Trace and Extended Events. Spill over is major issue since it indicates that physical reads from TEMPDB occured. Cause of problem is in CE.


Parallelism

You can hint that you don't want it using DOP hint (degree of parallelism). Not good or bad. It consumes resources.

Parameter sniffing

Related to executing stored procedures with parameters. Optimizer creates cached plan for value of parameter and then uses the same when stored proc gets executed with different value for parameter.
In some cases this results in long execution of stored proc for some parameter values. Why? Imagine table with 10 million rows. If you try to filter by parameter using stored proc 1000 rows then plan will be optimized expecting 1000 rows. When afterwards you use it to filter parameter value that should return 1 million rows another query plan would be more suitable but query optimizer won't create it. It will use existing cached that was optimized for 1000 rows.

https://www.mssqltips.com/sqlservertip/3257/different-approaches-to-correct-sql-server-parameter-sniffing/
















Aug 1, 2017

Design patterns

Types:

  • Creational
  • Structural
  • Behavioral 


Singleton 

  • requiring only one instance! For example only one (single) object may access text file or some resources at the time.
  • create sealed class that cant' be instantiated. Through one static public method (usually called Singleton) provide access to instance of of class. Ensure thread safe using lock and static object.
Factory

  • objects that are heavily used and frequently instantiated in various places. We expect that object creation may be affected in future by some other parameters. So we dedicate special class.
  • create static class with static method to handle object creation.
Unit of work
  • we need to combine many CRUD operations on different related entities in on single unit of work (transaction). Either it goes all or nothing.

Repository
Use a repository to separate the logic that retrieves the data and maps it to the entity model from the business logic that acts on the model. The business logic should be agnostic to the type of data that comprises the data source layer. For example, the data source layer can be a database, a SharePoint list, or a Web service.

Jul 27, 2017

RePost: Working from home

https://blog.trello.com/tips-for-tackling-remote-work-challenges?utm_source=newsletter&utm_campaign=july2017_newsletter2&utm_medium=email

https://blog.trello.com/organize-workspace-maximum-productivity

SQL, .NET, C#, ASP.NET refreshing memory

Just refreshing my mind :

(1) ICollection vs (2) IEnumerable - (2) - iterating !    (1) modifying

(1)Class vs (2) Structure - (2) Value type, lives on Stack, can't assign NULL, no need for (De)Constructor

Can't access non-parameter-less base constructor -> constructor chaining in derived class required

OOP :
  •  Abstraction - 
The abstract person is defined by the operations that can be performed on it, and the information we can get from it and give to it. 
An abstraction denotes the essential characteristics of an object that distinguish it from all
other kinds of object
  • Inheritance -
Each of these library’s assets should be represented by its own
class definition.  Without inheritance though, each class must
independently implement the characteristics that are common to all
loanable assets.
  • Polymorphism
Overriding + overloading
  • Encapsulation

switch - NO FALLTHROUGH;  break is mandatory OR empty case

value types - struct(1) & enumarations(2) - (1) numbers + bool + char

reference types - class, interface, delegate + built in - object, dynamic, string

ASP.NET Page life cycle

InitComplete - changes to ViewState will be persisted since controls start tracking them

Load

Control events

LoadComplete - all controls finished loading

PreRender - the very last moment before rendering affect controls

Unload


SQL

Normalization forms:
1NF - each field must contain smallest atomic information 

  • Full Name = "Bob Dylan" - wrong !
  • Name = "Bob", LastName = "Dylan"
each row must contain same number of fields

2NF - Only relevant for composite keys!
1NF must be implemented.
Non-key field should not describe or relate to field contained in composite key. New table should be created.
  • PK(EmployeeId + DepartmentID) + DepartmentAddress   - 2NF violated ! New table Department must be created and related.

3NF - Non-key fields must not describe fields not part of PK. Each non-key field must relate only to PK.
2NF must be implemented

  • PK(EmployeeId) + Name + DepartmentCity + DepartmentAddress
  • Calculated fields !   Price + Quantity + Amount(relates to price and quantity !)