Monday, April 8, 2019

Number Only Field - Quick Input Mask

Quick way to allow decimal or integer numbers only in a form.

$(".allowDecimal").on("keypress keyup blur", function (event) {
    $(this).val($(this).val().replace(/[^0-9\.]/g,''));
    if ((event.which != 46 || $(this).val().indexOf('.') != -1) 
       && (event.which < 48 || event.which > 57)) 
    {
        event.preventDefault();       
    }
});

 
$(".allowIntegerOnly").on("keypress keyup blur", function (event) {   
    $(this).val($(this).val().replace(/[^\d].+/, ""));
    if ((event.which < 48 || event.which > 57)) 
    {
        event.preventDefault();
    }
});

Key CodeKey
0That key has no keycode
3break
8backspace / delete
9tab
12clear
13enter
16shift
17ctrl
18alt
19pause/break
20caps lock
21hangul
25hanja
27escape
28conversion
29non-conversion
32spacebar
33page up
34page down
35end
36home
37left arrow
38up arrow
39right arrow
40down arrow
41select
42print
43execute
44Print Screen
45insert
46delete
47help
480
491
502
513
524
535
546
557
568
579
58:
59semicolon (firefox), equals
60<
61equals (firefox)
63ß
64@ (firefox)
65a
66b
67c
68d
69e
70f
71g
72h
73i
74j
75k
76l
77m
78n
79o
80p
81q
82r
83s
84t
85u
86v
87w
88x
89y
90z
91Windows Key / Left ⌘ / Chromebook Search key
92right window key
93Windows Menu / Right ⌘
95sleep
96numpad 0
97numpad 1
98numpad 2
99numpad 3
100numpad 4
101numpad 5
102numpad 6
103numpad 7
104numpad 8
105numpad 9
106multiply
107add
108numpad period (firefox)
109subtract
110decimal point
111divide
112f1
113f2
114f3
115f4
116f5
117f6
118f7
119f8
120f9
121f10
122f11
123f12
124f13
125f14
126f15
127f16
128f17
129f18
130f19
131f20
132f21
133f22
134f23
135f24
144num lock
145scroll lock
160^
161!
162؛ (arabic semicolon)
163#
164$
165ù
166page backward
167page forward
168refresh
169closing paren (AZERTY)
170*
171~ + * key
172home key
173minus (firefox), mute/unmute
174decrease volume level
175increase volume level
176next
177previous
178stop
179play/pause
180e-mail
181mute/unmute (firefox)
182decrease volume level (firefox)
183increase volume level (firefox)
186semi-colon / ñ
187equal sign
188comma
189dash
190period
191forward slash / ç
192grave accent / ñ / æ / ö
193?, / or °
194numpad period (chrome)
219open bracket
220back slash
221close bracket / å
222single quote / ø / ä
223`
224left or right ⌘ key (firefox)
225altgr
226< /git >, left back slash
230GNOME Compose Key
231ç
233XF86Forward
234XF86Back
235non-conversion
240alphanumeric
242hiragana/katakana
243half-width/full-width
244kanji
251unlock trackpad (Chrome/Edge)
255toggle touchpad

Monday, October 22, 2018

C: drive gets full on IIS server

I came across two scenarios where the C: drive gets completely full on a IIS server. I suspected the log file folder first, but it turned out to be something else hidden.


  • Scenario 1: I ran a warmup script that uses an instance of IE to fully mimics a full page load of web applications, not just page hit.
  • Scenario 2: I set up an IIS server as a dedicated SharePoint provider-hosted on-prem web server. Over time, the C: drive was getting full. Warmup script used to run for a while on this server. 
In both cases, the following folder was the culprit. When using an instance of IE, it probably used this folder for caching.

C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\


Thursday, August 30, 2018

SSRS: Remove Duplicates in Parameter Drop-down

While SharePoint was being queries from a SSRS report, GroupBy did not work in the CAML query in the DataSet definition of the SSRS report.

 One workaround was to use a global VB function inside the report, which removes duplicate parameter values in a parameter dropdown.

https://social.technet.microsoft.com/wiki/contents/articles/36632.ssrs-remove-duplicate-filter-values-from-parameter-drop-down-using-vb-code.aspx


Wednesday, August 29, 2018

Insert Stored Procedure Result into Table

The following does not work unfortunately unless table1 already exists with columns with matching field names, data types and field order.
INSERT INTO table1
exec sp_GetProducts @CategoryID=12
Stored procedures that returns tabular results in SQL Server do not allow saving the results in a new table like we would expect (The receiving table must exist with all columns' data types and fields names ahead of time for the query to work).
The workaround is to use either OpenRowset or by creating a new function.
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

SELECT *
INTO table1
FROM OPENROWSET (
  'sqlncli',
  'server=(local)\SQL12;trusted_connection=yes',
  'exec Northwind.dbo.sp_GetProducts @CategoryID=12'
);


When using a user-defined function instead, we are basically re-writing the stored procedure in user-defined function.
CREATE FUNCTION GetProductsByCategory
(
    @CategoryID int
)
RETURNS TABLE
AS
    RETURN
        select * from dbo.Products where CategoryID=@CategoryID
GO

SELECT *
INTO table1
FROM GetProductsByCategory(12);
GO

Tuesday, August 21, 2018

Send email notification when free disk space is low

Powershell script that detects local disk drives with less free space than specified value and sends email notifications (I can't recall where I got the following script. It was probably written by a SQL Server admin).

# Get SMTP server info
$smtp=new-object Net.Mail.SmtpClient("myEmailServer.myDomain.com")

# Set thresholds in GB for C: drive and other drives
$driveCthreshold=10
$threshold=10

# Replace settings below with your e-mails
$emailFrom="serverToMinitor@myDomain.com"
$emailTo="myName@myDomain.com"

# -----------------------------------------------------------------------------

# Get server name
$hostname=Get-WMIObject Win32_ComputerSystem | Select-Object -ExpandProperty name

# Get all drives with free space less than a threshold, while excluding System Volumes
$Results = Get-WmiObject -Class Win32_Volume -Filter "SystemVolume='False' AND DriveType=3" | Where-Object {($_.FreeSpace/1GB –lt  $driveCthreshold –and $_.DriveLetter -eq "C:") –or ($_.FreeSpace/1GB –lt  $threshold –and $_.DriveLetter -ne "C:" )}

If ( ($Results | measure).Count -gt 0 ) 
{
    ForEach ($Result In $Results)
    {
        $drive = $Result.DriveLetter
        $space = $Result.FreeSpace
        $thresh = if($drive -eq 'C:'){$driveCthreshold} else {$threshold}

        # Send e-mail if the free space is less than threshold parameter 
        $smtp.Send(
           $emailFrom, 
           $emailTo, 
           # E-mail subject
           "Disk $drive on $hostname has less than $thresh GB of free space left ",
           # E-mail body 
           ("{0:N0}" -f [math]::truncate($space/1MB))+" MB"
        )
    }
}

Monday, August 20, 2018

ASP.NET MVC - Handle binary or byte arrays as in file download

In ASP.NET MVC, downloading a file over http has been simplified and is user-friendly. The following code streams byte arrays to browser in two ways. GetFile would prompt for user dialog for choice as to Open or Save. OpenFile would try to stream the byte array content and render it in browser directly (pdf, etc). The sample code assumes that db.Binaries entity already has properties, such as BinaryData, MimeType and FileName, etc.
[HttpGet]
pulic FileContentResult GetFile(int id)
{
  var binary = db.Binaries.Find(id);
  if (binary == null)
  {
    return null;
  }
  byte[] binaryData = binary.BinaryData;
  string mimeType = binary.MimeType;
  string fileName = binary.FileName;

  return File(binaryData, mimeType, fileName);
}

[HttpGet]
public ActionResult OpenFile(int id)
{
  var binary = db.Binaries.Find(id);
  if (binary == null)
  {
    return null;
  }
  var contentDisposition = new System.Net.Mime.ContentDisposition
  {
    FileName = binary.FileName, Inline = false
  };
  Response.AddHeader("Content-Disposition", "inline; filename=" + binary.FileName);
  
  return File(binary.BinaryData, binary.MimeType);
}

Thursday, August 16, 2018

Maximum Request Length Exceeded - ASP.NET

When uploading or downloading a large amount of content, ASP.NET may need some request length adjustments in the web.config file. Example below would allow a request to continue for maximum of 3600 seconds (1 hour) and 1 GB of content.

<configuration>
  ...
  <system.web>
    <httpRuntime targetFramework="4.5" executionTimeout="3600" maxRequestLength="1048576" />
  </system.web>
  ...
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="1073741824" /> <!-- 1 GB in bytes -->
      </requestFiltering>
    </security>
  </system.webServer>
  ...
</configuration>