Category Archives: dev

Call IBM Watson APIs to add Machine Learning to your App

You can easily add very cool IBM Watson APIs to your application. You need to sign up for Bluemix, create an application and bind APIs or services to the app. This will create credentials (username and password) for each API or service.

Create a Bluemix acccount

First if you have not signed up for a Bluemix account yet, go to and Sign Up.

Create an App

Once you have confirmed your account, go to the Catalog and choose any Runtime. We will only use the runtime to bind services to, which will give us API credentials. For example, name the app ‘my-app1’.

Add a Service

Now, to add Services either go to Catalog > Services, and add a service to your app, or go to your app’s admin page. Bluemix is based on Cloud Foundry, so apps in Bluemix are listed under ‘CF Apps.’ Go to Dashboard > CF Apps > ‘my-app1’, and click the ‘Add a Service or API.’ I will add Personality Insights to my app in this example. Edit the required fields and click the Create button. Bluemix might ask you to restage your app. Now we’re ready to call the Personality Insights API.

Call the Watson API

To make a REST call to a Watson API, you must add an Authorization header with a Base64 encoded “Basic :” string. To generate the Basic Authorization header, use the colon as a separator for username and password and Base64 encode the Authorization string.

String username = "username from your service credentials";
String password = "password from your service credentials";
String s = username + ":" + password;
byte[] b = s.getBytes();
String enc = Base64.encodeBase64String(b);
String authorization = "Basic "+enc;

To call the API with the above credentials use the following curl statement from command line.

curl -X POST -H "Authorization: Basic BzAvEATz4UYqKfU5JA66GSIwKNgdATGiADR8YiWaOSH2Purd6tedhKUJaPa3KLshLq==" -H "Content-Type: text/plain" -H "Accept: application/json" -H "Accept-Language: en" -H "headers: true" -d 'put your text here'

For the API reference details go here!/personality-insights/profile

This curl command will return a response object that you can visualize with the Visualize Personality Insights API.!/personality-insights/visualize

Send a multipart/form-data request in PHP


To List your current indexes with ‘standard’ flavor use a GET request to the List Indexes API.

$url_listindexes = '';
$params1 = 'flavor=standard&apikey='.$apikey;
$response = file_get_contents($url_listindexes .'?'.$params1);
if($response) { $json = json_decode($response); if($json){ $indexes = $json->index; } return $indexes; }


POST multipart/form-data with native PHP

function send_multipart_post_message($sync_or_async, $json1){
$url = "".$sync_or_async."/addtotextindex/v1";
// using WordPress custom functions to retrieve index and apikey
$index1 = wp_idolondemand_get_setting('index');
$apikey = wp_idolondemand_get_setting('apikey');
$eol = "\r\n";
$data = '';
$data .= '--' . $mime_boundary . $eol;
$data .= 'Content-Disposition: form-data; name="apikey"' . $eol . $eol;
$data .= $apikey . $eol;
$data .= '--' . $mime_boundary . $eol;
$data .= 'Content-Disposition: form-data; name="index"' . $eol . $eol;
$data .= $index1 . $eol;
$data .= '--' . $mime_boundary . $eol;
$data .= 'Content-Disposition: form-data; name="json"; filename="allposts.json"' . $eol;
$data .= 'Content-Type: application/json' . $eol;
$data .= 'Content-Transfer-Encoding: base64' . $eol . $eol;
$data .= base64_encode($json1) . $eol;
// alternatively use 8bit encoding
//$data .= 'Content-Transfer-Encoding: 8bit' . $eol . $eol;
//$data .= $json1 . $eol;
$data .= "--" . $mime_boundary . "--" . $eol . $eol;
$params = array('http' => array(
'method' => 'POST',
'header' => 'Content-Type: multipart/form-data; boundary=' . $mime_boundary,
'content' => $data
//'proxy' => 'tcp://localhost:8888' //use with Charles to catch http traffic
$ctx = stream_context_create($params);
$response = file_get_contents($url, FILE_TEXT, $ctx);
return $response;

Continue reading

[JavaScript] Find Related Concepts as D3js Bubble Chart

The Find Related Concepts API from IDOL OnDemand returns the most relevant terms and concepts from related documents. Here’s represented as a D3 Bubble Chart. Thanks to incredibly good work by Mike Bostock. For a description of the API go here
For D3 Data-Driven Documents go here:

[JavaScript] POST upload file with XHR FormData

This example uses the Optical Character Recognition (OCR) API from IDOL OnDemand. For details see here:

HTML5 and JavaScript: Flip an Image using HTML5 Canvas

See the working code example on jsfiddle.

<!DOCTYPE html>
<title>Flipping an Image Horizontally and Vertically</title>
<script src="jquery-1.11.1.min.js"></script>
<script type="text/javascript">
var imageurl = null;
$(document).ready( function() {
$('#loadimage').click(function() {
$('#mirrorh').click(function() {
$('#mirrorv').click(function() {
function urlProvided() {
var userinput = document.getElementById('imageurl');
imageurl = userinput.value;
function loadImage(){
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var img = new Image();
img.src = imageurl;
img.onload = function(){
var w = img.width;
var h = img.height;
canvas.width = w;
canvas.height = h;
function mirror(mirrorh,mirrorv){
var canvas=document.getElementById('canvas');
var ctx=canvas.getContext('2d');
var img = new Image();
img.src = imageurl;
var w = img.width;
var h = img.height;
ctx.scale(1, -1);
ctx.translate(0, -h);
ctx.scale(-1, 1);
Your image URL: <input type="text" id="imageurl"></input><button id="loadimage">load image</button>
<button id="mirrorh">mirrorh</button>
<button id="mirrorv">mirrorv</button>
<canvas id="canvas"></canvas>

CSharp: POST Request to Query API and JSON Parsing

Use the System.Net.WebClient object to make a POST request in C#. For parsing JSON, you can use Json.NET by James Newton-King. Install both packages using the NuGet Package Manager. This code example posts a search for the text ‘Dog’ to the Query API. This example uses the text parameter, if you want to use the file parameter to upload a document as a search parameter you will need to use multipart/form content type, with for instance RestSharp client for .NET.

string apiKey = "your-apikey";
string iodURL = "";
WebClient webClient = new WebClient();
NameValueCollection formData = new NameValueCollection();
formData["apikey"] = apiKey;
formData["text"] = "Dog";
byte[] responseBytes = webClient.UploadValues(iodURL, "POST", formData);
UTF8Encoding enc = new UTF8Encoding();
string json = enc.GetString(responseBytes);

The JSON response is serialized using Json.NET into .NET Objects representing the JSON response as a DocumentList of Document type.

DocumentList documentList = JsonConvert.DeserializeObject(json);
List docs = documentList.Documents;
public class DocumentList
public List Documents { get; set; }
public class Document
public string Reference { get; set; }
public double Weight { get; set; }
public List Links { get; set; }
public string Index { get; set; }
public string Title { get; set; }
public Object Content { get; set; }

The above code will parse the JSON response from IDOL OnDemand.

"documents" : [{
"content" : { },
"index" : "news_eng",
"links" : [ "DOG" ],
"reference" : "",
"title" : "Stick Dog Wants a Hot Dog by Tom Watson - review",
"weight" : 89.5
"content" : { },
"index" : "news_eng",
"links" : [ "DOG" ],
"reference" : "",
"title" : "Dog attacks on children are tragic – but we can try to understand the triggers | Deborah Orr",
"weight" : 88.010000000000005

Access the properties as normal:

foreach (Document doc in docs)
Debug.WriteLine("doc.reference: " + doc.Reference);

To do a multipart/form-data POST request, the simplest way is to use a client like RestSharp, which you can install via NuGet:

string apiKey = @"your-apikey";
string iodURL = @"";
string file = @"C:\Users\user1\Documents\iod\TheSecretSpiritualHistoryOfCalculus_ScientificAmerican.pdf";
var client = new RestClient(iodURL);
var request = new RestRequest("", Method.POST);
request.AddParameter("apikey", apiKey);
request.AddFile("file", file);
RestResponse response = (RestResponse) client.Execute(request);
string content = response.Content;
Debug.WriteLine("status: "+ response.StatusCode + ", content: " + content);

Brian Grinstead wrote a great article on a Multipart form post in C# implementation, for those who are interested.

Arduino: TMP36 temperature sensor

The TMP36 temperature sensor is an easy to use temperature sensor. With a few lines of code you can measure the temperature with reasonable accuracy.

int sensorPin = A0;
float celsius;
float kelvin;
float fahrenheit;
void getTemperature()
float val = analogRead(sensorPin);
// analogRead returns a 0 to 5 volts measure on a scale from 0 to 1023,
// i.e. 2*10 bits or 1024 units
val = (val * 5.0) / 1024;
// convert Volts to milliVolts
// the TMP36's linear scale is 10 mV / degree Celsius
// i.e. (* 1000 / 10) = * 100
val = (val) * 100;
celsius = val;
kelvin = val + 273.15;
fahrenheit = ((val * 9)/5.0) + 32;


Cordova: Install or Update Cordova on Windows with Visual Studio

To install Apache Cordova on Windows and to use it with Visual Studio 2010 Express for Windows Phone, follow these steps:

  1. Get the source code for the latest version from the Cordova project page or for older versions go to the Cordova distribution archive.
  2. Unzip the source archive
  3. Locate the file in the extracted directory, and unzip the archive.
    C:/>cd cordova-3.4.0
  4. Change directory to cordova-wp8 and run the createTemplates.bat script.
    C:/cordova-3.4.0>cd cordova-wp8
  5. Copy the generated template files and to the Visual Studio Templates directory in the users My Documents folder ~/Document
    s\Visual Studio 2010\Templates\ProjectTemplates.
    C:\cordova-3.4.0\cordova-wp8>copy "C:\Users\user1\Document
    s\Visual Studio 2010\Templates\ProjectTemplates"

Now, start Visual Studio 2010 Express for Windows Phone, and in the File menu, select New Project…. In the Installed Templates select the Cordova template you just copied.

To add Cordova plugins on Windows with Visual Studio, go here.

Cordova: adding camera plugin to wp7 in Visual Studio Express on Windows 7 Pro

To see how to install Cordova on Windows with Visual Studio, go here.

After you created the Cordova app using the generated Template in Visual Studio, you must use the plugman package instead of the cordova tool to install plugins. If you didn’t install plugman, first install plugman using npm.
>npm install -g plugman

To add the plugin camera use the following code inside the root of the solution.
C:\>cd \dev\mobile\CordovaWP7_3_4_0_App1
C:\dev\mobile\CordovaWP7_3_4_0_App1>plugman install --platform wp7 --project CordovaWP7_3_4_0_App1 --plugin
Fetching plugin "" via plugin registry
Starting installation of "" for wp7
Preparing wp7 project installed on wp7.

Cordova: submit multipart form with additional parameters

With the Cordova plugin File-Transfer you can submit a multipart form with additional parameters. To read an image file as a binary string, you can use the HTML5 FileReader syntax from the File API by using the Cordova plugin File.

For instance, the following example uses Idol On Demand‘s APIs to analyze images for barcodes.

Add the required plugins.
$cordova plugin add org.apache.cordova.console
$cordova plugin add org.apache.cordova.file
$cordova plugin add org.apache.cordova.file-transfer

This is the code to submit a multipart form in Cordova. Note that the additional parameters are added to the form by using the options.params property with an associative array of parameters.

var formURL = "";
var encodedURI = encodeURI(formURL);
// add additional parameters 'file' and 'apikey' to the multipart form
var options = new FileUploadOptions();
options.fileKey = "file";
// strip the filename from the full path
options.fileName = fileURI.substr(fileURI.lastIndexOf('/') + 1);
var imgData = readFileAsBinaryString(fileURI);
options.params = { 'apikey': apikey, 'file': imgData };
// create the FileTransfer object
var ft = new FileTransfer();
// submit the multipart form
ft.upload(fileURI, encodedURI, fnOnSuccess, fnOnError, options, false);

The readFileAsBinaryString(file) is implemented like this:

function readFileAsBinaryString(file) {
 console.log("readFileAsBinaryString(: "+file+")");
 var reader = new FileReader();
 reader.onloadend = function(e) {
  console.log("Successfully read file as binary string");
  var imgData =;
  return imgData;
 reader.onerror = function(e) {
  console.log("Error while reading file as binary string: ";