Search This Blog

Showing posts with label Javascript. Show all posts
Showing posts with label Javascript. Show all posts

Sunday, June 21, 2020

Sunday, December 15, 2019

Create circle with google map api with mousemove event to enlarge / shrink area

function addCircle_new(lat, lng, radius, alreadyDrawn) {
    function createCircle(lat, lng, radius) {

        var coordinates = new google.maps.LatLng(lat, lng);

        var options = {
            strokeColor: '#910000',
            strokeOpacity: 0.5,
            strokeWeight: 1,
            fillColor: '#FC7341',
            fillOpacity: 0.35,
            map: map,
            center: coordinates,
            radius: radius
        };
        // Add the circle for this city to the map.
        circle = new google.maps.Circle(options);
        return circle;
    }

    var circle;

    if (alreadyDrawn) {
        circle = createCircle(lat, lng, radius * 1000);
        drawObject = circle;
        pois.push(circle);
    }
    else {
        //google.maps.event.removeListener(clickListener);
        google.maps.event.addListenerOnce(map, 'click', function (x) {

            //circle = createCircle(x.latLng.lat(), x.latLng.lng(), radius * 1000);
            circle = createCircle(lat, lng, radius * 1000);

            var clickEventParameters = x;
            var mouseMoveEventParameters;

            var mouseMove = google.maps.event.addListener(map, 'mousemove', function (y) {
                mouseMoveEventParameters = y;

                var xOffset = mouseMoveEventParameters.qa.x - clickEventParameters.qa.x;
                var yOffset = mouseMoveEventParameters.qa.y - clickEventParameters.qa.y;
                var radiusOffset = Math.sqrt(Math.pow(xOffset, 2) + Math.pow(yOffset, 2)) * 100000;

                circle.setRadius(radiusOffset);

            });
            var dblClick = google.maps.event.addListener(map, 'dblclick', function (w) {
                drawObject = circle;
                google.maps.event.removeListener(mouseMove);
                pois.push(circle);

                //clickListener = google.maps.event.addListener(map, 'click', map_MouseClick);
            });
        });

    }
}

Monday, June 24, 2019

Print call stack in javascript

From https://til.hashrocket.com/posts/478143b559-print-call-stack-on-javascript

Print call stack on Javascript

If you want to print the javascript **call stack** you can use:

```javascript
console.log(new Error().stack);
```

Here it is an **example**:

```javascript
function firstFunction() {
    secondFunction();
}
function secondFunction() {
    thridFunction();
}
function thridFunction() {
    console.log(new Error().stack);
}
firstFunction();

//=> Error
//    at thridFunction (<anonymous>:2:17)
//    at secondFunction (<anonymous>:5:5)
//    at firstFunction (<anonymous>:8:5)
//    at <anonymous>:10:1
```

h/t @rondale_sc

viniciusnegrisolo
June 10, 2016

Sunday, February 10, 2019

Thursday, December 20, 2018

Javascript Obfuscation via Jenkins using Node Js and the open source Javascript Obfuscator

A javascript snippet with which I obfuscate javascript files during our building process, via Jenkins (via Node js commands), using the open source Javascript Obfuscator (written in javascript).

var walkSync = function(dir, filelist, dirIgnores, fileIgnores) {
    var fs = fs || require('fs');

    //if dir is to be ignored, return doing nothing
    for (var i = 0; i < dirIgnores.length; i++) {
        if (dir.toLowerCase().endsWith("/" + dirIgnores[i].toLowerCase())) {
            return;
        }
    }

    files = fs.readdirSync(dir);
    filelist = filelist || [];
    //lists file starting names to not obfuscate
    dirIgnores = dirIgnores || [];
    fileIgnores = fileIgnores || [];
    files.forEach(function(file) {

        var fullPath = dir + '/' + file;

        if (fs.statSync(fullPath).isDirectory()) {
            filelist = walkSync(fullPath, filelist, dirIgnores, fileIgnores);
        } else {

            var skip = false;
            for (var i = 0; i < fileIgnores.length; i++) {
                if (file.toLowerCase().startsWith(fileIgnores[i].toLowerCase())) {
                    skip = true;
                    break;
                }
            }

            if (file.endsWith('js') && !skip) {
                filelist.push(fullPath);
            }
        }

    });
    return filelist;
};



var JavaScriptObfuscator = require('javascript-obfuscator');

// folder will be assigned in jenkins via windows batch string replacement
const folder = '#|#';
const fs = require('fs');

//we obfuscate only our javascript code, all third party libraries (located under folder js) are ignored
var files = walkSync(folder, null, ["js"], null /*["jquery", "leaflet", "dx", "knockout", "jstree"]*/ );

//console.log(files);
var errors = [];

for (var i = 0; i < files.length; i++) {
    var file = files[i];
    var jsFileContents = fs.readFileSync(file, 'utf8');

    console.clear();
    console.log('File being obfuscated: ' + file + '...');

    try {
        //obfuscate
        var obfuscationResult = JavaScriptObfuscator.obfuscate(
            jsFileContents,
            /*************************************************************************/
            /* Javascript-obfuscator preset: Medium obsfuscation, optimal performace */
            /*************************************************************************/
            {
                compact: true,
                controlFlowFlattening: true,
                controlFlowFlatteningThreshold: 0.75,
                deadCodeInjection: true,
                deadCodeInjectionThreshold: 0.4,
                debugProtection: false,
                debugProtectionInterval: false,
                disableConsoleOutput: true,
                identifierNamesGenerator: 'hexadecimal',
                log: false,
                renameGlobals: false,
                rotateStringArray: true,
                selfDefending: true,
                stringArray: true,
                stringArrayEncoding: 'base64',
                stringArrayThreshold: 0.75,
                transformObjectKeys: true,
                unicodeEscapeSequence: false
            }
        );

        //obfuscated content
        var obfuscatedJs = obfuscationResult.getObfuscatedCode();

        //fs.writeFileSync(file.replace('.js', '_o.js'), obfuscatedJs, {encoding: 'utf8'});
        fs.writeFileSync(file, obfuscatedJs, {
            encoding: 'utf8'
        });
    } catch (e) {
        errors.push('Error obfuscating ' + file + ': ' + e);
        //console.log('Error obfuscating ' + file + ': ' + e);
    }

}

console.log(files.length + ' files obfuscated. Errors: ' + errors.length);
if (errors.length > 0)
    for (var i = 0; i < errors.length; i++)
        console.log(errors[i]);

Wednesday, August 10, 2016

Javascript learning resources

I found in Felix Kling's stackoverflow profile 3 really interesting links about learning javascript.

Eloquent JavaScript (free online edition)
You don't know JavaScript (free online edition)
quirksmode.org - especially DOM and event handling

I was surprised to find the sources look very good and are free.

Sunday, December 13, 2015

Enforcing a given number of digits in a numeric value in Javascript

Javascript does not a built-in functionality like C#'s .ToString("0000").

To accomplish the same I came up with the following:

function setNumericFormat(value, numOfDigits, paddingChar) {
var length = value.toString().length;
if (length < numOfDigits) {
var prefix = "";
for (var i = 1; i <= numOfDigits - length; i++) {
prefix += paddingChar;
}
return prefix + value.toString();
}
return value.toString();
}

Resembles a LeftPad function...