Archive for the ‘Uncategorized’ Category

Make an HTTP request via #TCP over an Authenticated #proxy in C#

October 11, 2018 Leave a comment


If you ever find yourself reverting to writing HTTP code using TCPClient, do a double-think, since there is very few situations where you genuinely need to resort to writing TCP/IP code. You can do an Authenticated proxy call using standard HTTP calls, by just setting the networkCredentials on a WebProxy class.

However, if you’ve read this caveat, and you still insist that you need to write code at TCP/IP level, then here’s some code that demonstrates how to make a simple HTTPS get request via an Authenticated HTTP Proxy (Luminati)

The authentication token, which I’ve omitted below, for obvious reasons is a base64 encoded version of your username : your password .

var tcp = new TcpClient(“”, 22225);
var stream = tcp.GetStream();

var connect = Encoding.ASCII.GetBytes(“CONNECT HTTP/1.0\n” +
“proxy-authorization: Basic XXXXXX==\n\n”);
stream.Write(connect, 0, connect.Length);
var rawStream = new StreamReader(stream);
var ssl = new SslStream(stream);
ssl.AuthenticateAsClient(“”, null, SslProtocols.Tls12, false);
var strPostString = “GET / HTTP/1.0\r\n” +
“\r\n” +
var send = Encoding.ASCII.GetBytes(strPostString);
ssl.Write(send, 0, send.Length);
var sr = new StreamReader(ssl);
var str = sr.ReadToEnd();
return str;


Categories: Uncategorized

Determine the age of a #Spanish Vehicle through it’s number plate

October 9, 2018 Leave a comment


Take the last three digits of a spanish number plate, and find the closest three letters in the grid above to aproximate the age of the vehicle. This grid also gives an idea of how many cars are sold in spain in any given month.

Need to code this up in C#? here’s a GIT repo that you can clone freely;

Need more info, check our our spanish API at

Categories: Uncategorized

Creating a #macOS App using HTML and #Javascript

October 6, 2018 Leave a comment

Screenshot 2018-10-06 at 20.38.30

You can create great macOS apps with Swift, and if you’ve got the time to learn a new language, then this is the way to go. But if you already have something cool made with HTML and Javascript, then you can turn it into a macOS app with a few simple steps.


If you want to skip to the end, you can just clone the GIT repo at

But, if you fancy going step by step, – open up XCode and create a new macOS / Cocoa app. Drop a WKWebView onto the form, and set it’s constraints so that it fills the view. Then drag an outlet called;

@IBOutlet weak var webkitview: WKWebView!

You’ll need to add a reference to WebKit as follows;

import WebKit

Then in the viewDidLoad, add the following lines

let url = Bundle.main.url(forResource: “index”, withExtension: “html”)!
webkitview.loadFileURL(url, allowingReadAccessTo: url)
let request = URLRequest(url: url)

You can then go Add files to … and add your index.html to the project. Now, if you run this now, you may get a white page. To get around this, you will need to go to the project > Capabilities > App Sandbox and click “Outgoing connections (Client)”

Screenshot 2018-10-06 at 20.44.41

Another thing that you may have to do, or else the app may get rejected by apple, is to exit the app when the window is closed. you do this in AppDelegate.swift as follows;

func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool
return true


Categories: Uncategorized

Sending multiple attachments with #SMTPJS

October 6, 2018 Leave a comment


One of the limitations of is that you can only send one attachment, this blog post demonstrates a way of sending multiple attachments, by zipping them into one file. It also keeps the size of your email down also.

This uses the JSZip library, which I’ve loaded via the cloudflare CDN. Note the mime type used: application/x-zip-compressed this is important, so that SMTPJS will send the file as a attachment named, rather than the default file.txt

function uploadFileToServer()
  var zip = new JSZip();
  var numberOfFiles = event.srcElement.files.length;
  var numberOfProcessedFiles = 0;
  for(var i=0; inumberOfFiles; i++)
     var file = event.srcElement.files[i];
     var reader = new FileReader();
     reader.onload = function () {
        zip.file(,btoa(reader.result), {base64: true} );
        if (numberOfProcessedFiles == numberOfFiles)
          .then(function(content) {
            var datauri = "data:application/x-zip-compressed;base64," + content;
                "This is the Subject ",
                "This is the Body - see attachment!",
                "****SMTP HOST****",
                "****SMTP USERNAME****",
                "****SMTP PASSWORD****",
                function done(message)
                   alert("Message sent OK")

<input type="file" id="fileupload" onchange="uploadFileToServer()" multiple/>


Categories: Uncategorized

Charging a credit card with #Stripe in C#

October 4, 2018 Leave a comment


This has been demoed a million times before, but just to show how ridiculously simple it is to bill a card with stripe, here’s a code example in C#

You first open package manager and type


Then use the following code:

var strStripeSecretKey = “sk_live_xxxxxxxxxxxxxx”;
var strCardNumber = “xxxxxxxxxxxxxxxxx”; // Long card number
var strCvCNumber = “xxx”;
var intExpiryMonth = 1;
var intExpiryYear = 2019;
var requestOptions = new StripeRequestOptions() { ApiKey = strStripeSecretKey };
var chargeService = new StripeChargeService();
var chareResponse = chargeService.Create(new StripeChargeCreateOptions()
Amount = 1000, // In pence – i.e. £10
Currency = “GBP”,
SourceCard = new SourceCard()
Number = strCardNumber,
Cvc = strCvCNumber,
ExpirationMonth = intExpiryMonth,
ExpirationYear = intExpiryYear
}, requestOptions);

And that’s all there is!  – wow…


Categories: Uncategorized

#Javascript Error handling with #Chakra in C#

September 21, 2018 Leave a comment

Chakras Woman Rainbow Background

Microsoft’s ChakraCore DLL allows you run Javascript within C# applications using IE’s Javascript interpreter, without having to spawn an exernal process like PhantomJS. This has great applications for situations where you might want to evaluate a user-provided mathematical equation, perhaps like within a spreadsheet, or a statistical application.

The Hello world example can be cloned from Github here;

You’ll also need to get the built version of the DLL from Nuget here;

Install-Package Chakra.Core

I noticed that I had to copy the DLL from bin\x86 into the bin folder when running an application as 32 bit (A console app), and copy bin\x64 into the bin folder when running under IIS (64 bit)

One thing that I had to build myself in the C# code, was error handling. If the Javascript expression was buggy, then the result was null, with no information about why the Javascript had failed (for example, I noticed that btoa() and atob() were missing in Chakra – for base64 encoding/decoding).

So, to capture the error message, you need to add the following lines after RunScript

varerror = Native.JsRunScript(script, currentSourceContext++, “”, outresult);
Native.JsConvertValueToString(exception, outexceptionString);
varstrEx = JavascriptValueToString(exceptionString);

Where JavascriptValueToString is defined as follows;

private static string JavascriptValueToString(JavaScriptValuevalue)
// Project script result in JS back to C#.
IntPtr resultPtr;
UIntPtr stringLength;
Native.JsStringToPointer(value, outresultPtr, outstringLength);
stringresultString = Marshal.PtrToStringUni(resultPtr);
return resultString;
Categories: Uncategorized

Database mail not working from #SQL server (fixed)

September 17, 2018 Leave a comment


Database mail allows you send email from SQL server, which is handy to report the status of jobs. It’s easy to set up, if you expand  Management, select Configure Database Mail, to set your SMTP credentials. Then press send Test Email to check it works.

If it doesn’t work, then, here was a issue I ran in to; if you run

EXEC msdb.dbo.sysmail_help_queue_sp

And both queues are marked as INACTIVE, then you may be missing .NET 3.5 from your server,


You can add .NET 3.5 via server managment, Add Roles and Features Wizard.

You may need to restart your SQL server service after installation.

Categories: Uncategorized