Initial Observations of Amazon Connect

If you don’t know what Amazon Connect is and you’re in the contact center world, you might want to consider a new career path. Amazon Connect is AWS’s answer to the Ciscos, Genesys, Avayas of the world. Not only that, but also a competitor for Twilio, Microsoft, and anyone who carries voice from point A to point B. Needless to say, when the Amazon giant moves everyone pays attention. A lot of these are just a brain dump so pardon the brevity. I’m still trying to dig a bit deeper and come up with specific ideas to blog specially comparing Amazon’s solutions with Cisco’s offering(s).

Things which are awesome:

– Agent logs are in JSON format, holy crap that’s awesome!
– Hours of operations are available out of the box and are granular to the minute. Ability to add exceptions for the same day is a nice touch.
– If you associate an email with your agent your agent can reset their own password.

Things which are strange:

– Can’t change agent state while reserved or talking.
– If you use a desk phone, you can’t reject the call.  
– Changes take about a minute or two to propagate and there’s no notification if your changes are live or not.      
– If you create a new agent and then login as that agent using the same browser as before your admin session will be moved over to the new agent credentials. Painful when trying to test permissions on agents.     
– You can’t re-route a connector by clicking on the start point, you must first delete the existing line and then create your new connector.

Things which absolutely make no sense:

– Every step should have a Lambda invocation option. This would make the scripting a lot cleaner.
– If you reject a call and you’re the only agent you’re automatically set back to ready. Queue must be drained before last agent can change states out of available.
– No default routing? I disabled the only queue and calls just dropped when I tried to route to that queue. You would think that the system would force some sort of default routing option just in case you make a mistake.  
– Contact flow editor, no easy way to get back to all your contact flows.
– Agent auto accept takes about 12 seconds to trigger using softphone, this would impact agent stats and I really don’t see the point of having this feature if it’s going to take this long to connect an agent.
– When you save or publish a contact flow you get the same message "Contact flow saved successfully!" Different message for publish would be nice.
– No easy way to move the whole script. Work area should have infinite scroll to all sides.
– You can’t select multiple nodes and move them, you must move one by one.
– Flows don’t auto save drafts, if for some reason you don’t remember to save you’re SOL.
– How draft flows and published flows are handled is confusing. Not very user friendly.
– Checking contact attributes doesn’t offer a NULL or NOT NULL condition check.
– When a connector goes behind a flow node, you can’t delete the connector.
– No way to duplicate nodes. You must configure a new node from scratch every time.   

~david

Connecing an ESXi host to a QNAP NAS using NFS

Interesting little issue I ran into when trying to create a new datastore in my ESXi server. I had to use NFS v2/v3 even though the ESXi documention states v4 is supported. Here are my specs:

– QNAP TS-219P II 4.3.3.0404

– VMWare ESXi v6.0.0 Build 5050593

To configure the NFS share in the NAS. Control Panel > Win/MAC/NFS > NFS Service

QNAP NFS Service

To ensure your share has NFS partitions click on the link that says “Click here to set the NFS access…” Choose your shared folder and Edit Shared Folder Permissions. And click

QNAP NFS host access screen

In ESXi, click on the host server. Configuration > Storage > Add Storage…

1. Network File System

2. Server IP, Folder, Datastore Name

3. Finish

ESXi Locate Network File System

When done, you should see your NAS as a data store.

ESXi Datastore Configuration

~david

Installing Laravel 5.5 & MySQL in Ubuntu 16.04 with Nginix already installed

Here are my notes on how to install these components.

sudo apt-get install php7.0-mbstring php7.0-xml composer unzip
sudo apt-get install -y php7.0 php7.0-fpm php7.0-mysql php7.0-zip php7.0-gd
sudo apt-get install mcrypt php7.0-mcrypt
sudo apt-get install -y php7.0-mbstring php7.0-xml –force-yes
sudo apt-get install php7.0-curl php7.0-json
sudo vi /etc/php/7.0/fpm/php.ini
    cgi.fix_pathinfo=0
sudo service php7.0-fpm restart
sudo mkdir -p /var/www/laravel
sudo vi /etc/nginx/sites-available/default
server {
        listen 80;
        listen [::]:80 ipv6only=on;

        root /var/www/laravel/public;
        index index.php index.html index.htm;

        # Make site accessible from http://localhost/
        server_name <serverName>;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.php?$query_string;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}
cd ~
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo composer create-project laravel/laravel /var/www/laravel
sudo chown -R :www-data /var/www/laravel
sudo chmod -R 775 /var/www/laravel/storage
sudo chmod -R guo+w storage
sudo apt-get update
sudo apt-get install mysql-server
sudo mysql_secure_installation

Cisco Spark Webhooks using Node.js

I’ve been trying to come up with a reason to play around with node.js. I’ve also been trying to make some time to play around with the Cisco Spark API. So I figured I would merry the two of them. My intention was to setup a webhook on a channel, then in my node application display the messages being posted in my room. Pretty simple example, but it touches a few different things.

First, you need to setup your webhook to point to your server.

Second, you need to have node installed, in this case I’m using Ubuntu 16.04.

Third, write some code. Check out my comments to follow along.

//will use these for the POST request

var express = require("express");
var myParser = require("body-parser");
var app = express();

//will use this for the GET request

var http = require(‘https’);

app.use(myParser.json());
app.post("/", function(request, response){

console.log(request.method);

//console the webhook name as well as the name of the author of the message
console.log(‘Webhook:’+request.body.name);
console.log(‘Email:’+request.body.data.personEmail);

//setup your GET request to find out the actual message posted by the author

var options = {
host: ‘api.ciscospark.com’,
path: ‘/v1/messages/’+request.body.data.id,
headers: {
  ‘User-Agent’: ‘request’,
  ‘Authorization’: ‘Bearer MyAuth’
}
}

//make the request

http.request(options, OnResponse).end();
});

//capture the request response

function OnResponse(response){
var data = ”;
response.on(‘data’, function(chunk){
  data += chunk;
});

response.on(‘end’, function(){
  data = JSON.parse(data);

//console out the actual text
  console.log(data.text);
});
}

app.listen(8080);

~david

Cisco Finesse Desktop Tabs for Supervisors

This came up on this thread and figured I would post something about it is an easy mistake. The Finesse layout is devided into an Agent and Supervisor section. So adding a tab to the top of the default layout will only add it to the Agent view. You can tell the layouts apart by the following tags:

<layout>
    <role>Agent</role>
    <page>

</layout>

or

<layout>
    <role>Supervisor</role>
    <page>
</layout>

~david

Travels to India

I had the pleasure of traveling to India this past week. Here are a few observations for those of you who might be venturing out for the first time.

– I was expecting 3rd world, but really India is a new industrialized country (NIC). The media, stories from past colleagues, and just general lack of knowledge all were preparing me for some pretty grim experiences around the have and have nothings. Although there is some stark poverty and you see it often, it felt that the big cities were all moving in the right direction of the monetary spectrum.

– The honor system of driving. My preference would be to never drive in Mexico City, however I don’t think I could drive in India even if you put a gun to my head. There is a direct link between the driver and the car horn and this link is unbroken and used every 10 seconds. Imagine every motorized vehicle on the road using the horn for everything. You’re going to try and pass someone, horn. You’re going to make a turn, horn. You’re entering a lane, horn. The explanation was that this was the way to keep everyone around you informed that you were there and to mind you, honestly with so many horns going off at the same time, it’s difficult for me to not understand how do people not become immune to that sound. The system seems to work as I didn’t see a single accident, and traffic cops were few and far between.

– When two wheels will inherit the earth. Motorbikes and mopeds outnumber cars in the big cities. Followed by these little 3 wheel “taxis”. These vehicles are like ants, they can get into any space and will utilize any lane available. Which generally means a lane which is not a lane. What Americans would consider a normal 3 lane road for 3 cars, in India the space will allow 2 cars, 5 motorbikes, and 2 taxies to weave in and around each other in a single car length.

– Expecting Mexican Spicy. I love spicy food and I eat a lot of India food in the US which you can generally ask for it to be made spicier. No matter how much I tried, I couldn’t get anyone to give me any decent heat on any of my meals.

– Personal space means nothing. In the US we generally will occupy an elevator by moving towards the walls. You start with the call directly opposite to the door, then move to the wall closes to the controls, and finally the corners. When the walls are occupied, it’s now time to take the centered most area created by this square of people. Not in India. If the walls are utilized, someone will stand closest to whoever they see first. This means an 8 inches away, face to face ride where I found myself asking, “Is this gentleman going to try and kiss me?” I had a few other occurrences where strangers would look over my shoulder at my phone and where hand holding, hugging, and all around physical contact was significantly different than what you see in the states.

– Time zones where sleep goes to die. If you’re expecting to conduct business with your US counterparts and will be in India for any significant amount of time, prepare to hurt. The first few nights it was not so bad to have a meeting at 10:30 PM India Standard Time (IST), but anything beyond that and things got very difficult or impossible. Add to the fact that you’ll never really be on IST, but on some nebulous I’ll sleep for short periods of time and feel exhausted most of the time I’m awake time zone. Move all your meetings as early as possible. Send emails which don’t require some back and forth.

– IT is it. If you’ve been to Silicon Valley you’ll see vast zones with big building dedicated to technology. In India, you’ll see the same thing with bigger buildings an more people. I knew IT was big in India, I didn’t know just how big. I’m not sure if it’s just that the building seems larger and that people tend to spend more time outside, but it just felt bigger than any single US city.

I’m looking forward to going back, hopefully with more time and with an opportunity to travel all over the country.

~david

Armada by Ernest Cline (Who wrote Ready Player One)

This book has been on my nightstand for a long while and I finally sat down and got a chance to finish it. I didn’t hate the book, but I didn’t love it either.

First, it was a very similar premise to Ready Player One*. A young kid who lives his life playing video games and has an afinity for 80s music. Second, a lot of things felt very rushed. The book could have spent more time on the attacks and talked a bit more about Earth’s reaction. Instead it just focused on a few “dog fights” and didn’t deliver on the bigger effect accross the world. Finally, the love story seemed very forced. I understand the need to use this element, but it seemed so unecessary in the context of this book. Almost, felt like she was written in after the fact and to just check a box off.

If you’re on the fence on which book to read first or which book to read at all, skip Armada* and go for Ready Player One.

~david

*ref links

Another star!

A lot of people run into me in the Cisco Support Forums as I try to keep pretty active not only to keep my memory fresh on some stuff I don’t touch much but to also keep a pulse on what the world is working on. The forum allows other users to provide you with points based on how they find your answers useful. Just got to the next level based on points awarded, a lovely shade of blue.

image

The breakdown:

image

Using git to push and pull repositories.

I’ve been trying to get more proficient with git and figured the only way to do that is to get my hands dirty and write some simple app(s) and push them to a production server. There are my notes, mainly for me to help me remember how this stuff works.

The very first time you do a git init to initialize your repository.

git init

You do this every time you want to add new changes to your reposiotry.

git add .

To see the status of things which are going to be added, removed.

git status

Once you’re happy with what you want to commit, leave your future self a little love note.

git commit –m “Doing something”

You only do this the first time to setup your remote repository destination.

git remote add origin git@github.com:dmaciasSS/myrepo.git

Then you do this every time you want to push your commit.

git push –u origin master

Now, let’s say I want to pull my repository to a new host e.g. production. If you’re using Laravel make sure you’re setting up your environment name in your vhost file first.

sudo git clone https://github.com/dmaciasSS/myrepo.git locaton/in/my/server

Laravel specific commands.

chown -R :www-data app/storage

chmod –R 777 app/storage

‘composer install’

php artisan cache:clear

I’ve found for 5.1 you might have to do this the first time too.

mkdir storage/views

mkdir storage/sessions

chown –R :www-data app/storage

Now, once you’ve cloned your repository you need to updated it every time you want to pull down any new commits.

sudo git pull origin master

composer update

php artisan cache:clear

~david