Two Basic Parts of a Low Cost Web Site Promotion

Anybody could own a web site. Anybody could up sell their own products and services to their target audience. Anyone could try to promote their web site with a low cost. But there are not many web sites that have a truly successful web site with traffic all day through. What these individuals or companies lack is the most essential factor of success – a low cost web site promotion that really works. Continue reading “Two Basic Parts of a Low Cost Web Site Promotion”

The Trojan of the Month Award goes to: Avril Sparrowhawk CWIH8974 PAYMENT RECEIVED

I just got a bit of malware spam: “CWIH8974 PAYMENT RECEIVED” / “Avril Sparrowhawk [Avril.Sparrowhawk@lescaves.co.uk]”

This fake financial spam does not come from Les Caves de Pyrene but is instead a simple forgery with a malicious attachment. How did I know it was spam? I don’t buy wine. 🙂

If you receive this e-mail, delete it immediately and contact your IT Support company. Do not open the attachment(s).

virusThe attached file is a malicious document “CWIH8974.doc” which has a low detection rate. There are likely other variants of this virus going around but in the cases we’ve seen it downloads a malicious executable file from.

The virus itself allows the hacker to compromise the web browser so that when the user tries to log in to their Internet Banking, the details are leaked to the hacker who attempts to withdraw funds from the user’s bank account.

From: Avril Sparrowhawk [Avril.Sparrowhawk@lescaves.co.uk]
Date: 22 December 2015 at 11:14
Subject: CWIH8974 PAYMENT RECEIVED
Continue reading “The Trojan of the Month Award goes to: Avril Sparrowhawk CWIH8974 PAYMENT RECEIVED”

How can I report a person attempting to hack me?

There are a number of laws regarding hacking a computer you don’t have authorization to hack, the CFAA in the USA, the CMA in Great Britain, the CHM in Australia, and the list goes on. All of which make it illegal to do what you want to do, and in some cases have pretty strict penalties for even the smallest of actions.

The term most often used to describe what you’re talking about is Hacking Back. It’s part of the Offensive Countermeasures movement that’s gaining traction lately. Some really smart people are putting their heart and soul into figuring out how we, as an industry, should be doing this. There are lots of things you can do, but unless you’re a nation-state, or have orders and a contract from a nation-state your options are severely limited.

There’s always an “Abuse” email address on the whois of a netblock for reporting misuse of an IP address.

You can use http://whois.domaintools.com/ to do a whois lookup to get the address.

hackers-hacking-4

If you are using WordPress, use Wordfence! They are really good!

Continue reading “How can I report a person attempting to hack me?”

Koalas to the Max – Cool HTML5 Canvas Painter

This awesome website uses hovers over a circle area to split the circle into four other circles and then four more and four more – each time reducing the size of the circle and the colour of the circles and making sure none of the circles meet.

http://www.koalastothemax.com/

The JS Code:

 

"use strict"

/*
* Made with love by Vadim Ogievetsky for Annie Albagli (Valentine's Day 2011)
* Powered by Mike Bostock's D3
*
* For me on GitHub:  https://github.com/vogievetsky/KoalasToTheMax
* License: MIT  [ http://koalastothemax.com/LICENSE ]
*
* If you are reading this then I have an easter egg for you:
* You can use your own custom image as the source, simply type in:
* http://koalastothemax.com?
* e.g.
* http://koalastothemax.com?http://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Flag_of_the_United_Kingdom.svg/200px-Flag_of_the_United_Kingdom.svg.png
*
* also if you want to use a custom image and want people to guess what it is
* (without seeing the url) then you can type the url in base64 encoding like so:
* http://koalastothemax.com?
* e.g.
* http://koalastothemax.com?YXN0bGV5LmpwZw==
* (try to guess the image above)
*/

var koala = {
  version: '1.8.2'
};

(function() {
  function array2d(w, h) {
    var a = [];
    return function(x, y, v) {
      if (x < 0 || y < 0) return void 0;
      if (arguments.length === 3) {
        // set
        return a[w * x + y] = v;
      } else if (arguments.length === 2) {
        // get
        return a[w * x + y];
      } else {
        throw new TypeError("Bad number of arguments");
      }
    }
  }

  // Find the color average of 4 colors in the RGB colorspace
  function avgColor(x, y, z, w) {
    return [
      (x[0] + y[0] + z[0] + w[0]) / 4,
      (x[1] + y[1] + z[1] + w[1]) / 4,
      (x[2] + y[2] + z[2] + w[2]) / 4
    ];
  }

  koala.supportsCanvas = function() {
    var elem = document.createElement('canvas');
    return !!(elem.getContext && elem.getContext('2d'));
  };

  koala.supportsSVG = function() {
    return !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', "svg").createSVGRect;
  };

  function Circle(vis, xi, yi, size, color, children, layer, onSplit) {
    this.vis = vis;
    this.x = size * (xi + 0.5);
    this.y = size * (yi + 0.5);
    this.size = size;
    this.color = color;
    this.rgb = d3.rgb(color[0], color[1], color[2]);
    this.children = children;
    this.layer = layer;
    this.onSplit = onSplit;
  }

  Circle.prototype.isSplitable = function() {
    return this.node && this.children
  }

  Circle.prototype.split = function() {
    if (!this.isSplitable()) return;
    d3.select(this.node).remove();
    delete this.node;
    Circle.addToVis(this.vis, this.children);
    this.onSplit(this);
  }

  Circle.prototype.checkIntersection = function(startPoint, endPoint) {
    var edx = this.x - endPoint[0],
        edy = this.y - endPoint[1],
        sdx = this.x - startPoint[0],
        sdy = this.y - startPoint[1],
        r2  = this.size / 2;

    r2 = r2 * r2; // Radius squared

    // End point is inside the circle and start point is outside
    return edx * edx + edy * edy <= r2 && sdx * sdx + sdy * sdy > r2;
  }

  Circle.addToVis = function(vis, circles, init) {
    var circle = vis.selectAll('.nope').data(circles)
      .enter().append('circle');

    if (init) {
      // Setup the initial state of the initial circle
      circle = circle
        .attr('cx',   function(d) { return d.x; })
        .attr('cy',   function(d) { return d.y; })
        .attr('r', 4)
        .attr('fill', '#ffffff')
          .transition()
          .duration(1000);
    } else {
      // Setup the initial state of the opened circles
      circle = circle
        .attr('cx',   function(d) { return d.parent.x; })
        .attr('cy',   function(d) { return d.parent.y; })
        .attr('r',    function(d) { return d.parent.size / 2; })
        .attr('fill', function(d) { return String(d.parent.rgb); })
        .attr('fill-opacity', 0.68)
          .transition()
          .duration(300);
    }

    // Transition the to the respective final state
    circle
      .attr('cx',   function(d) { return d.x; })
      .attr('cy',   function(d) { return d.y; })
      .attr('r',    function(d) { return d.size / 2; })
      .attr('fill', function(d) { return String(d.rgb); })
      .attr('fill-opacity', 1)
      .each('end',  function(d) { d.node = this; });
  }

  // Main code
  var vis,
      maxSize = 512,
      minSize = 4,
      dim = maxSize / minSize;

  koala.loadImage = function(imageData) {
    // Create a canvas for image data resizing and extraction
    var canvas = document.createElement('canvas').getContext('2d');
    // Draw the image into the corner, resizing it to dim x dim
    canvas.drawImage(imageData, 0, 0, dim, dim);
    // Extract the pixel data from the same area of canvas
    // Note: This call will throw a security exception if imageData
    // was loaded from a different domain than the script.
    return canvas.getImageData(0, 0, dim, dim).data;
  };

  koala.makeCircles = function(selector, colorData, onEvent) {
    onEvent = onEvent || function() {};

    var splitableByLayer = [],
        splitableTotal = 0,
        nextPercent = 0;

    function onSplit(circle) {
      // manage events
      var layer = circle.layer;
      splitableByLayer[layer]--;
      if (splitableByLayer[layer] === 0) {
        onEvent('LayerClear', layer);
      }

      var percent = 1 - d3.sum(splitableByLayer) / splitableTotal;
      if (percent >= nextPercent) {
        onEvent('PercentClear', Math.round(nextPercent * 100));
        nextPercent += 0.05;
      }
    }

    // Make sure that the SVG exists and is empty
    if (!vis) {
      // Create the SVG ellement
      vis = d3.select(selector)
        .append("svg")
          .attr("width", maxSize)
          .attr("height", maxSize);
    } else {
      vis.selectAll('circle')
        .remove();
    }

    // Got the data now build the tree
    var finestLayer = array2d(dim, dim);
    var size = minSize;

    // Start off by populating the base (leaf) layer
    var xi, yi, t = 0, color;
    for (yi = 0; yi < dim; yi++) {
      for (xi = 0; xi < dim; xi++) {
        color = [colorData[t], colorData[t+1], colorData[t+2]];
        finestLayer(xi, yi, new Circle(vis, xi, yi, size, color));
        t += 4;
      }
    }

    // Build up successive nodes by grouping
    var layer, prevLayer = finestLayer;
    var c1, c2, c3, c4, currentLayer = 0;
    while (size < maxSize) {
      dim /= 2;
      size = size * 2;
      layer = array2d(dim, dim);
      for (yi = 0; yi < dim; yi++) {
        for (xi = 0; xi < dim; xi++) {
          c1 = prevLayer(2 * xi    , 2 * yi    );
          c2 = prevLayer(2 * xi + 1, 2 * yi    );
          c3 = prevLayer(2 * xi    , 2 * yi + 1);
          c4 = prevLayer(2 * xi + 1, 2 * yi + 1);
          color = avgColor(c1.color, c2.color, c3.color, c4.color);
          c1.parent = c2.parent = c3.parent = c4.parent = layer(xi, yi,
            new Circle(vis, xi, yi, size, color, [c1, c2, c3, c4], currentLayer, onSplit)
          );
        }
      }
      splitableByLayer.push(dim * dim);
      splitableTotal += dim * dim;
      currentLayer++;
      prevLayer = layer;
    }

    // Create the initial circle
    Circle.addToVis(vis, [layer(0, 0)], true);

    // Interaction helper functions
    function splitableCircleAt(pos) {
      var xi = Math.floor(pos[0] / minSize),
          yi = Math.floor(pos[1] / minSize),
          circle = finestLayer(xi, yi);
      if (!circle) return null;
      while (circle && !circle.isSplitable()) circle = circle.parent;
      return circle || null;
    }

    function intervalLength(startPoint, endPoint) {
      var dx = endPoint[0] - startPoint[0],
          dy = endPoint[1] - startPoint[1];

      return Math.sqrt(dx * dx + dy * dy);
    }

    function breakInterval(startPoint, endPoint, maxLength) {
      var breaks = [],
          length = intervalLength(startPoint, endPoint),
          numSplits = Math.max(Math.ceil(length / maxLength), 1),
          dx = (endPoint[0] - startPoint[0]) / numSplits,
          dy = (endPoint[1] - startPoint[1]) / numSplits,
          startX = startPoint[0],
          startY = startPoint[1];

      for (var i = 0; i <= numSplits; i++) {
        breaks.push([startX + dx * i, startY + dy * i]);
      }
      return breaks;
    }

    function findAndSplit(startPoint, endPoint) {
      var breaks = breakInterval(startPoint, endPoint, 4);
      var circleToSplit = []

      for (var i = 0; i < breaks.length - 1; i++) {
        var sp = breaks[i],
            ep = breaks[i+1];

        var circle = splitableCircleAt(ep);
        if (circle && circle.isSplitable() && circle.checkIntersection(sp, ep)) {
          circle.split();
        }
      }
    }

    // Handle mouse events
    var prevMousePosition = null;
    function onMouseMove() {
      var mousePosition = d3.mouse(vis.node());

      // Do nothing if the mouse point is not valid
      if (isNaN(mousePosition[0])) {
        prevMousePosition = null;
        return;
      }

      if (prevMousePosition) {
        findAndSplit(prevMousePosition, mousePosition);
      }
      prevMousePosition = mousePosition;
      d3.event.preventDefault();
    }

    // Handle touch events
    var prevTouchPositions = {};
    function onTouchMove() {
      var touchPositions = d3.touches(vis.node());
      for (var touchIndex = 0; touchIndex < touchPositions.length; touchIndex++) {
        var touchPosition = touchPositions[touchIndex];
        var prevTouchPosition = prevTouchPositions[touchPosition.identifier]
        if (prevTouchPosition) {
          findAndSplit(prevTouchPosition, touchPosition);
        }
        prevTouchPositions[touchPosition.identifier] = touchPosition;
      }
      d3.event.preventDefault();
    }

    function onTouchEnd() {
      var touches = d3.event.changedTouches;
      for (var touchIndex = 0; touchIndex < touches.length; touchIndex++) {
        var touch = touches.item(touchIndex);
        prevTouchPositions[touch.identifier] = null;
      }
      d3.event.preventDefault();
    }

    // Initialize interaction
    d3.select(document.body)
      .on('mousemove.koala', onMouseMove)
      .on('touchmove.koala', onTouchMove)
      .on('touchend.koala', onTouchEnd)
      .on('touchcancel.koala', onTouchEnd);
  };
})();

Create SAP Web Service with SAP .Net Connector in 5 minutes

Author: Dennis Wang / Microsoft / EAS /SAP

What is SAP .NET Connector

  • SAP product. Based on Microsoft .NET Technology
  • Interact with SAP via RFC/SOAP
  • Fully integrated with Visual Studio.NET
  • Managed Code
  • Generates C# Proxy Classes for any .NET application integrations
  • Supports RFC and SOAP
  • Supports qRFC, tRFC
  • Supports asynchronous SOAP calls
  • RFC client or RFC server

SAPNET

Feature of Web Service

  • It is ASP.Net Web Service
  • Hosted by IIS. Using HTTP protocol
  • Secure: SSL for connection. NTLM for authentication. Role base authorization.
  • Single sign via NTLM GSSAPI
  • Platform Neutral. Can be accessed via http protocol.
  • Strong versioning via XML Namespace

Steps to Create Web Service for RFC_Customer_Get

  • Create a C# project for ASP.Net Web Service
  • Generate SAP Proxy via SAP .Net Proxy Generator for RFC_Customer_Get
  • Open Proxy1.cs and change the following line
  • public void Rfc_Customer_Get(…) to public virtual void Rfc_Customer_Get (…)
  • Open Service1.asmx and do the following modification
  • public class Service1 : SAPProxy1
  • public override void Rfc_Customer_Get (…)
  • Add this code in this method
  • this.Connection = SAP.Connector.SAPConnectionPool.GetConnection (MyConnectionString);
  • base.Rfc_Customer_Get(Kunnr,Name1, ref Customer_T);
  • Compile the code and you have the web service for this RFC.

How SAP Single Sign On work under ASP.Net Web Service

singlesign

Set up single sign on for web service

IIS Configuration

  • Disable anonymous access
  • Set up Windows Integrated Authentication

Web Service Configuration
Generate encrypted user name and password via aspnet_setreg.exe program. This value will then be set up in registry. Here we assume the user name is SAPCMDEV
Add the following line in Web.Config

<identity impersonate=”true” sername=”registry:HKLMSoftwareSapWebServiceIdentityASPNET_SETREG,sername”
password=”registry:HKLMSoftwareSapWebServiceIdentityASPNET_SETREG,password” /> 
GSS Library
  • Requires on the server where Web Service is located.
  • Copy the GSSNTLM.DLL to c:windowssystem32
  • If the GSSNTLM.DLL was copied to a folder other then within the environment search path, you need to add the following line in system environment SNC_LIB=”file pathGSSNTLM.dll”
  • Make sure to replace the gssapi32.dll with this GSSNTLM.dll if the old gssapi32.dll exists. The old gssapi32.dll does not work.
  • Create Entry in Table SNCSYSACL via SNC0
  • This table contains a list of trusted domain accounts or SNC.
  • Start SAP and run SNC0
  • Make sure to enable the RFC/CPIC/Ext ID options

singlesignon

  • Make sure all users who access SAP will have their User Accounts in USRACL or via SU01
  • Mapping external users into SAP users
  • Run SM30 and table VUSREXTID
  • Value: Work Area=NT.
  • Value: External ID = MYDomaindennisw
  • Program The Connection String with the following value:
  • SNC_MODE=1;
  • SNC_PARTNERNAME=”p:” + System.Security.Principal.WindowsIdentity.GetCurrent().Name; ‘ Web Service Process Account
  • EXTIDDATA=User.Identity.Name; ‘Caller credential
  • EXTIDTYPE=“NT”;

infopath

How does InfoPath 2003 connect to SAP?

  • Utilize SAP RFC and BAPI.
  • Generate RFC/BAPI proxy by using SAP .Net Connector
  • Create Web Service Wrapper around the proxy
  • Hosting/Publish the web service via WSDL
  • InfoPath Consume the web service
InfoPath 2003 SDK
–Available on microsoft.com under downloads
InfoPath 2003, Technical Webcasts, Technical White Papers, Development Guides
–MSDN
Visit http://microsoft-sap.com for information on:
–SAP at Microsoft
–SAP .Net Connector
–Upcoming customer workshops

Building Your Mailing List with Downloads

A mailing list is the lifeblood of your online business. The old adage “the money is in the list” cannot be true enough — if you had a targeted list of prospects to contact each time you have a new product, you will be able to save a lot of effort by marketing it to your existing list of targeted prospects.

You can actually build up a targeted list of prospects that are interested in your products by offering a relevant download on your website. For example, let’s take a look at a very good example — apple.com. When you download the free iTunes and Quicktime software from their site, they will ask you to fill in an optional name and email form so that they can send you offers on songs that you can purchase via — guess where — iTunes!

In reality, you do not need to offer such a “heavyweight” download such as a full-feature software like iTunes. You can attract prospects equally well with some quality freebies such as a simple report, a free wallpaper, and so on. The important thing is that your download offers enough value for the prospect to be willing to give away his/her own email address to get it.

However, slapping together a simple download and putting a link on your website won’t be enough to attract qualified prospects. You will have to do some homework in order for your lead-generating mechanism to work well for you.

First of all, you must place your download form prominently on your website. Preferably, dedicate a page to it and link to that page from every other page of your website. That way, there is no way your visitors cannot find the download page, and when they do, you’ll get some of them converted into your prospects!

Also, you have to put a little effort into promoting your download. Explain and elaborate on the values of the download, and why your visitors should download it. You might think why would anyone want to pass on a freebie, but most of your visitors would be too lazy to take the effort to download it because most of their downloads just sit on the harddisk collecting virtual dust. It is hence important to show your visitors why they should download your freebie.

How To Have Websites Built For You The Cheap Way

Normally, if you want to have professional designers custom build your site, you must be prepared to dish out at least a few hundred dollars. All this can change if you know where to find the best deals, the best designs for the lowest price. Here’s a rough guide:

First, you must understand that it is a rip off to get companies to design websites for you. Have you ever seen those advertisements in newspaper classified ad sections that offer a 5-page website at $500? These companies are established companies with physical locations, therefore they have to increase the amount they charge to pay off some overheads: office rent, designer’s wages, advertising costs and so on.

Therefore, it would be wise to find freelance designers who work from home. These people are often working from home so they do not have a high operation cost like that of a company. On the other hand, they will be able to design images with quality similar to those of designers from big companies, so it’s a “no-brainer” choice.

However, choose freelancers with care. The best way to do this would be to go to elance.com. There, you can post the abstract of your project and get thousands of freelancers to bid on your project, so you will surely get the best deal. On top of that, you will be able to choose the designers based on their experience, past transactions and ratings, so your value for money is secured.

Another route you can take is to design your website yourself. Think about it, if you only need 5 simple pages to present some simple information, why waste hundreds of dollars for it? Just spend a little time to sit down and do it yourself. You’ll be able to design your own sites even if you do not know a single line of HTML code with the help of WYSIWYG (what you see is what you get) programs such as Microsoft Frontpage, Macromedia Dreamweaver and so on.