Sending a VF Page as Attachment in Mail through Apex Class

Following code can be used for sending a vf page as an attachment with an email:

public class Gene_PDF{ 
public PageReference sendPdf(){                
     PageReference pdf = Page.mail_pdf;//mail_pdf is the name of vf page
     // goToNextPage('email');
     Blob body;                
        body = pdf.getContent();
     }catch(VisualforceException e){
            body=Blob.valueOf('Some text');
      Messaging.EmailFileAttachment attach = new Messaging.EmailFileAttachment();
      attach.Body = body;
      Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
      mail.setToAddresses(new String[] { email });
      mail.setSubject('PDF Email Demo');
      mail.setHtmlBody('Here is the email you requested! Check the attachment!');
      mail.setFileAttachments(new Messaging.EmailFileAttachment[] { attach }); 
      // Send the email    
      Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
      ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'Email with PDF sent to '+email));
      return null;

Here 1) mail_pdf is the visualforce page that we want to use as attachment and

2) email is a pre-acquired Email-ID from user to which the email will be sent.

Source Group formats for popular Sources in Social Studio

Source Groups

Source Groups, also known as source filters in Radian6 Analysis Dashboard, enable tracking and managing of social listening sources that are important to your company.

Source Groups are used in Social Studio to define a set of sources that you would like your topic profile to look at. The sources can be social assets, such as a Twitter handle or a Facebook page, or can be websites, such as blogs or forums. Source Groups are used for broad listening and the following:

  • Pulling in all content from relevant sites, regardless of the keywords the posts contain.
    Common use case: Companies wanting to pull in all content from their owned channels.
  • Pulling in keyword matched content from a specific set of sources.
    Common use case: Use for influencers where you can identify a list of people you deem to be influential, add them to a source group, and then match their posts against the keywords that are relevant to your brand.
  • Excluding all content from particular sites.
    Common use case: Exclude spam or unwanted content.

You can add multiple sources to a source group.

If the entered name is invalid, the entry field is outlined in red and a red triangle appears. Enter a valid source.

Source groups can be Public or Private but cannot be shared to another workspace.

For Following sources/handles you can add source groups:

  • Twitter
  • Facebook
  • YouTube
  • Forums
  • Blogs, News, and Aggregators
  • Pinterest
  • Sina Weibo
  • Tencent Weibo

Note: Instagram and LinkedIn cannot be added as Source Groups.


URL Format to be used:

  •<username>.rss  OR


If Twitter account URL:,

The Source Filter URL would be:


URL Format to be used:

  • Preferred Format:<PageName>/<PageID>
  • Alternate Format 1:<PageName>-<PageID>
  • Alternate Format 2:<PageID>


For the Marketing Cloud Facebook Page,

Page URL:
Page Name: Marketing Cloud
Page ID: 40373497138

  • Acceptable format 1:
  • Acceptable format 2:
  • Acceptable format 3:

Find your Profile ID or Page ID using the Explorer Graph or To find the ID using the Explorer Graph:

1. Click Get Access Token.
2. Leave all boxes unchecked and click Get Access Token.
3. Under “Graph API,” select GET.
4. Enter [pagename]?fields=id,name

Note: Use the page name or Facebook username as it appears at the end of the Facebook URL. For example: enter marketingcloud?fields=id,name

5. Click Submit.

The Page ID is listed in the response. For [pagename]?fields=id,name the ID is 40373497138 as indicated in the response:
{ “id”: “40373497138”, “name”: “Salesforce Marketing Cloud”}

For any owned Pages, you can also find the ID in the Page Settings:

1. Open your Facebook page.
2. Click the About tab.
3. Scroll down to the bottom of the Page Info section.
4. Next to Facebook Page ID, you can find your page ID.


URL Format to be used:

where ‘authorid’ is the ID (long character string) of the YouTube profile.


YouTube Page URL:

The Source Filter URL would be:

To find your YouTube Author ID, see here.


URL Format to be used:

URL format varies by site.

Blogs, News, and Aggregators

URL Format to be used:

The feed URL. Depends on the site, but typically contains “RSS” or “atom” or “feed(s)”


URL Format to be used:<PinterestID>/feed.rss where <PinterestID> is the individual’s Pinterest ID

Sina Weibo

URL Format to be used: where ‘2570336162’ is the author’s unique id available from

Tencent Weibo

URL Format to be used: where ‘frankfenn’ is the author’s unique id available from


Social Studio – Brief Introduction

What is Social Studio?

  • Social Studio helps marketers build 1:1 relationships that grow value for both the brand and the consumer.
  • Social Studio is a product under the Salesforce Marketing Cloud that deals with offering effective social media marketing solutions.
  • In particular, it helps businesses tap into the power of social media in its marketing, customer service, and sales organizations.
  • Social Studio is a one stop solution allowing you to manage, schedule, create and monitor posts organized by brand, region or multiple teams and individuals in a unified interface.
  • A single interface offers a fully customizable team-based collaboration platform that analyzes channel and content performance.
  • Analyze current trends and recommend new content ideas.
  • The platform is available on any device, so customers can run social marketing from their phone, tablet, or desktop

Why Use Social Studio?

With Social Studio you can:

  • Use Workspaces to create and configure workspaces to quickly organize teams by region (across the world, country or down the street), brand or business function to promote collaboration for campaigns, content creation, and publishing.
  • Use Collaborative Calendars to create and design content (with full preview) plus manage your content calendar (both future and past content) with fully featured planning and scheduling tools designed for teams.
  • Use Content Publishing to craft and schedule perfect social content tailored to specific social networks using our intelligent social network-centric platform beyond just a text entry box.
  • Promote your Facebook content by buying Facebook ads right from Social Studio and integrating with Ad campaigns.

Social Studio Components

Social Studio is made up of the following components: Publish, Engage, and Analyze.

  • Publish – Enables you to create and publish content, at scale, across channels, and in near real time.
  • Engage – Engage allows Community Managers to moderate and join conversations started with the content created using Publish.
  • Analyze – Allows discussion monitoring from owned social accounts and broader social news. Create custom dashboards to monitor multiple social accounts and Topic Profiles. Dashboards can be printed as a PDF for hardcopy records and sharing.

Analyze in Social Studio

Use Analyze in Social Studio to monitor the discussions of owned social accounts as well as broader conversations. You can understand what is being said, the overall tone of social discussions and how well certain topics and trends are performing.

Dashboards provide a summarized overview of social accounts and topics profiles, while workbenches provide a deeper more customizable view social account and topic profile data.

With Analyze you can create dashboards and workbenches to help visualize your data.
analyze db


  • Use dashboards to provide an at-a-glance performance summary over a specified time period. You can specify the time period using 1 day, 7 days, 14 days, 30 days, 60 days, 90 days or a custom range from 3 to 93 days.
  • You can create dashboards for up 50 Facebook, Twitter, LinkedIn, Google+, YouTube, or Instagram accounts. These accounts can appear on the same or on separate dashboards
  • You can change the date ranges for social accounts or topic profiles dashboards. Also, you can print the dashboard as a PDF for hard-copy records or share through email.


  • Use Workbenches to create custom datasets based on topic profiles and social accounts over a specified time period. The time period can be 1 day, 7 days, 14 days, 30 days or a custom range from 3 to 93 days.
  • You can use datasets to dive deeper into the data returned by the topic profile. The datasets can be configured to focus on one piece of data or used to compare multiple attributes from the same data set.

Einstein Vision

  • Einstein Vision is a new component of Social Studio Analyze. It works on workbench datasets for topic provides and provides a collection of pre-built image classifiers for Social Marketers.

Implement a drawing app in Swift

Implement smooth drawing in iOS using swift.

A drawing app allows the user to draw on the screen with their finger. There are many companies  ask customers to sign on apple device when making purchases. 


1> create a custom class line for initializing values of start and end point of line

import UIKit

class Line{

  var start : CGPoint

  var end : CGPoint

  init(start _start : CGPoint , end _end : CGPoint) {

    start = _start

    end = _end



2> We will create a custom drawview UIView class.  for drawing line from start and end point using draw function,   So that it can act like a canvas for our drawing app.  

import UIKit

class DrawView: UIView {

  var lines : [Line] = []

  var lastPoint : CGPoint!

  required init(coder aDecoder : NSCoder) {

    super.init(coder: aDecoder)!


  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    lastPoint = touches.first?.location(in: self)


  override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

    let newPoint = touches.first?.location(in: self)

    lines.append(Line(start: lastPoint, end: newPoint!))

    lastPoint = newPoint




  override func draw(_ rect: CGRect) {

    var context = UIGraphicsGetCurrentContext()


    for line in lines


      let aPath = UIBezierPath()

      aPath.lineWidth = 5.0

      aPath.lineJoinStyle = .round

      aPath.move(to: CGPoint(x:line.start.x,y:line.start.y))

      aPath.addLine(to: CGPoint(x:line.end.x,y:line.end.y))


      aPath.lineCapStyle = .round





3> write controller class in which we are using the draw view class for drawing line

import UIKit

class ViewController: UIViewController {

  @IBOutlet var drawView : AnyObject!

  override func viewDidLoad() {


    // Do any additional setup after loading the view, typically from a nib.


  override func didReceiveMemoryWarning() {


    // Dispose of any resources that can be recreated.


@IBAction func clearbutton()


  let theDrawView : DrawView = drawView as! DrawView

  theDrawView.lines = []




Happy Drawing

Using @future method in salesforce

Using @future method in salesforce and its limitations

Salesforce provides different ways to run your code asynchronously like Batch apex, @future method. In this post we will see how to use @future method, its advantages, limitations and the precautions that we need to follow while using it.
We can use the @future methods in cases where methods are long running. In such cases we can prevent governers limits by making it as asynchronous transaction. @ future methods also help in preventing mixed dml errors by isolating multiple dmls.
In order to mark a method as future we have to simply mark it with the ‘@future’ keyword as shown in below snippet.
Public static void futureMethod(){
//Your Code Here

Points to remember while creating @future methods:

1. future methods must always be static methods.
2. @future methods cannot return anything and its return type should always be void.
3. The input parameters to such methods can only be primitive types, arrays of primitive type or collections of primitive types.
4. Input parameters cannot be sobjects or collection of sobjects.
@future methods can also be used to make callouts to external services. To use this we must mark callout=true specifically. If it is not specified then the default value is taken as false.
public static void myfuturecalloutmethid(){
//code to call external services

Why are sObjects not allowed as parameters in case of @future methods?

It is because the sobjects may change by the time the method is executed, in such cases the @future method may overwrite the already saved values of the sObject record.
What is the workaround for above sobject case?
We can pass the object Id as parameter and then query the record within the @future method and then work on the latest data.
Limitations of @future method:
1. You cant call a future method from another future method.
2. You can call up to 50 @future methods per transaction.
3. You can call up to 250000 future methods per 24 hours. This is in conjunction with all types of asynchronous methods like batch apex.
4. @future methods are not executed during salesforce downtime and any already running jobs during the start of downtime are halted and restarted after the downtime.
Please go through Future Methods with Higher Limits (Pilot)
Precautions that we need to follow while using future methods:
1. Make sure you dont put too much in a future method as this will increase the execution time and may lead to delaying of other requests after the organisation limit of 2000 unprocessed future jobs is hit.
2. Opt for batch apex when you are processing large no of records.
3. Test your future methods with maximum possible data as this will give you an idea of how much the job may take during real time.


ERP Software Testing

Testing the ERP (e.g SAP) software application is different than testing the other software applications. ERP applications are domain specific and industry-specific. The common modules like Finance, Accounting, Inventory, Fixed Asset, Sales, Purchase, Human Capital, and Payroll are available in all the ERP systems.

Apart from these common modules, few industrial specific modules are available as per the targeted customers. For example, a “manufacturing ERP” may have a “production planning” module, a “pharma ERP” may have a “doctor-patient” module and an “education ERP” may have a “student” module and so on.

So we can take a example of One Module.

Test Scenario: Find below a sample ERP demonstration.

Module Sales & Distribution
Feature Sales Order Process
Objective To check the sales order is booked and invoiced with proper data entered for sales header and sales details.
Steps to Reproduce 1. Sales & Distribution -> Order Management -> Sales Order List -> New Sales Order.
2. Select Order Date, Select Order Type, Select the Expiry Date, Select Customer ID, Select Shipping ID, Select Warehouse ID, Select Shipping Date, Select Payment Due Date, Select Sales Tax ID, Select Salesman ID.
3. Select New Sales Items and Select Item ID, Select Item UOM, Enter Item Qty, Enter Item Price, Select Ledger Account, Select Project ID and Click OK.
4. Click Book Order button in the main screen.
Input Data
Order Date (01/01/2015), Order Type (Sales Order), Expiry Date (31/09/2015), Customer ID (SABIC), Shipping ID (FedEx), Warehouse ID (NaviMumbaiWH), Shipping Date (03/02/2015), Select Payment Due Date (28/02/2015), Sales Tax ID (ST929), Salesman ID (Anand), Item ID (PolyPropylene), Item UOM (Kilograms), Item Qty (1000), Ledger Account (23499949), Project ID (DueTarget2015)
Input Data
Order Date (01/01/2016), Order Type (Purchase Order), Expiry Date (31/09/2012), Customer ID (DEFAULT), Shipping ID (Blank), Warehouse ID (Blank), Shipping Date (03/02/2013), Select Payment Due Date (28/02/2012), Sales Tax ID (Blank), Salesman ID (DEFAULT), Item ID (DEFAULT), Item UOM (Blank), Item Qty (0), Ledger Account (DEFAULT), Project ID (DEFAULT)
Expected Results
1. Order should be booked and invoiced.
2. Picking Packing slip should be generated.
3. Shipping Order should be generated.
4. General Ledger transactions should be posted.
5. Inventory Ledger should be updated.
6. Debit Memo should be generated.
7. Email should be sent to the Customer and Stores.
Expected Results
• Alert box should be coming for each negative data input as per the alert process and the defined text.
• Sales order should be backordered, if the items are out of stock.
• Sales order should be on hold, if the customer credit limit is low.

Higher order functions in swift

As far as I understood, higher order functions are functions that takes another function/closure as argument and/or returns it.

Higher order functions are simply functions that operate on other functions by either taking a function as an argument, or returning a function. Swift’s Array type has a few methods that are higher order functions: sorted, map, filter, and reduce. These methods use closures to allow us to pass in functionality that can then determine how we want the method to sort, map, filter, or reduce an array of objects.
If you look around the internets the most commonly mentioned higher order functions in Swift are generally mapfilter, reduce and sort (or sorted). But there are so many more to play with!

Just take a look at Array – you will also find containsdropfirstflatMapforEachpartition  and split.


Use map to loop over a collection and apply the same operation to each element in the collection.

Map on array:

Let’s assume we need to multiply each item by 10 in an array called numberArray

          let numberArray = [2,3,4,5,6,7,8]
          let emptyArray:[Int] = []
          //MARK:-Traditional Way
         for number in numberArray{
Higher Order Functions that is map

There are few form’s: long-form vs shorthand closure syntax preference.
        //1) Way
        emptyArray = []

        emptyArray = ( { (value:Int) -> Int in
               return value*10
        //2) Way
        emptyArray = []
        emptyArray = { (value:Int) in
               return value*10
//3) Way
        emptyArray = []
        emptyArray = {value in value*10}
//4) Way
        emptyArray = []
        emptyArray = {$0 * 10}

The map function has a single argument which is a closure (a function) that it calls as it loops over the collection. This closure takes the element from the collection as an argument and returns a result. The map function returns these results in an array.

Map on Dictionary:

        let reviews = [“likes”:50, “comments”:52]

Here, for the above dictionary, as we iterate over the collection our closure has arguments that are a String and a Int from the types of the key and value that make up each element of the dictionary. The return type can be an array of values (i.e., 50), values array with discounts or even an array of tuples. It’s all upto you.

         let reviewsCount = { (key, value) in
                 return value
         //[50, 52]

Map on Custom Object:

    struct Person{
       let name:String
       let id:Int
           init(name:String, id:Int){
  = name
  = id
    let personDict = ["Palash":1,"Rahul":2,"Govind":3]
    let persons ={ name, id in Person(name: name, id: id)}

Array count  Traditional Way Exe. time    Using Hight Order Function map Exe. time
   6930         0.0645290017127991                         0.00439298152923584


Use filter to loop over a collection and return an Array containing only those elements that match an include condition.

Filter on array:

Consider the following code to filter even numbers from an array of integers.Now, like map , there is a simple method to do the filtering stuff for collection types.The swift autocomplete shows the following if we try to use filter method for an Int array.
The filter method has a single argument that specifies the include condition. This is a closure that takes as an argument the element from the collection and must return a Bool indicating if the item should be included in the result. I have given the shorthand closure syntax example below.,

         //MARK:-Traditional Way
         emptyArray = []
         for no in numberArray{
             if no % 2 == 0{

         //MARK:-Higher Order Functions
         emptyArray = []
         emptyArray = numberArray.filter{$0 % 2 == 0}

Filter on dictionary:

 The filter functions will call a closure called isIncluded by passing each key-value pair and do the condition check (here, it accepts a String and Doubleas arguments). Finally, based on the bool value returned, the filter function will decide whether or not to add the key-value pair in the returned array.
Filter function on dictionary returns an array of Tuples .

          let reviewsFilter = reviews.filter { (key, value) in
                  return value > 50


This can be further simplified as:

         let reviewsFilter1 = reviews.filter { $1 > 50}

       Note: $0 is the key, $1 is the value

Array count  Traditional Way Exe. time    Using Hight Order Function map Exe. time
 3300           0.000292956829071045                    0.00520197877883911


Combines all items in a collection to create a single value.

The most versatile function reviewed here is reduce. Reducing a sequence means transforming many items into a single item. For example, an array of integers could be reduced to the sum of every integer in the array. In this case, a sequence of integers is reduced to a single integer.

        //MARK:-Traditional Way
        var sum = 0
        for no in numberArray{
sum += no

The two parameters in reduce function are a starting value and a function respectively. The function takes a running total and an element of the array as parameters, and returns a new running total.

        //MARK:-Higher Order Functions
        //1 Way 
        var  sum = numberArray.reduce(0, {$0 + $1})
        //2 Way 
        var sum = numberArray.reduce(0,+)

In above scenario, instead of the closure, we could also pass basic operator functions like +, -, *, / . So we can say reduce is used to combine all items in a collection to create a single new value.

Reduce on dictionary

        let totalReviews = reviews.reduce(0) { (result, tupleOfKeyAndValue) in
                   return result + tupleOfKeyAndValue.value


When implemented on sequences : Flattens a collection of collections.

There are two versions of this function: one that supports mapping optional values and another that supports mapping a sequence of sequences, such as [[Int]] (i.e. an array of array of integers)

let tempArray = _flatMap([“Hi”,” “,“there”,” “, nil,“😁!!!!”]) { $0 }

//Hi there 😁!!!!

This function is like a mixture of map and filter. It creates a sequence of mapped values, but a mapped value is not added to the output sequence when the closure returns nil. In that sense, returning nil is similar to returning false from a closure passed to the filter function.


Happy Coding… 🙂📱😁
I will show the usage of remaining higher order function in my next post.

How to Integrate Pardot with WordPress via Contact Form 7

When you want to submit your form to third-party CRM like (pardot, Salesforce, MailChimp etc.) or if you want to
change action URL of the form please following steps.

To get this to work you need to have following things.

1.   WordPress website
2.  Contact Form7 Plugin – WordPress Plugin
3.  Forms: 3rd Party Integration – WordPress Plugin
4.  Pardot and the ability to create form handler

1. Create a Form using Contact Form7 which you want to submit on third-party CRM.
2. Create a Form Handler on pardot for the fields which you have used in contact form7 form.
3. Go to WordPress admin panel -> Contact -> 3rd party Services

i.  Now click on ‘[+]3rd-Party Service: Pardot‘ and give some service name.
ii. Next, you have to add 3rd party action URL into ‘Submission URL

Imp Note:  Action URL into ‘Submission URL’ must be HTTPS. This plugin does not support HTTP URL.
select the form from ‘Attach to Forms’ options

iii. Now you have to map your contact form fields with pardot form fields. Enter all contact form fields into
‘Form submission Field’ column and all pardot fields into ‘3rd-Party Field’ column.

Imp Note:  Values of ‘Form submission Field’ and ‘3rd-Party Field‘ must be identical. Small space or difference will break your submission.

iv. Next setup redirect URL into Contact Form7 settings.
v.  Now copy contact Form7 shortcode and paste it into any page.That’s it.

How to check user exist or not in pardot prospect using api-php

The Pardot API should be accessed via POST for all operations . For the most part the API does not use the standard HTTP response codes to convey the outcome of the request, rather it always returns 2 response codes and sends back its own set of status codes that need to be handled.

Steps for the check user in prospect :

Step 1 : Login to pardot by api :

$url = “********************************”;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);

$xml = simplexml_load_string($response);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

$api_key = $array[‘api_key’];

Above API will return access token in response(api_key).

Step 2 : Check user :

$url = “********************************&api_key=$api_key”

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);


If user exist then it will return [{“stat” : “ok”] otherwise it will return [{“stat”:”fail”}]


In the same way we can check user in pardot account also;

Repeat the above step for check user in account, there are only single change in second api.Replace prospect with account.********************************&api_key=api_key

Virtual Assistant

A virtual assistant is a software agent that can perform tasks or services for an individual. Sometimes the term “chatbot” is used to refer to virtual assistants generally or specifically those accessed by online chat (or in some cases online chat programs that are for entertainment and not useful purposes).

As of 2017, the capabilities and usage of virtual assistants is expanding rapidly, with new products entering the market. An online poll in May 2017 found the most widely used in the US were Apple’s Siri (34%), Google Assistant (19%), Amazon Alexa (6%), and Microsoft Cortana(4%). Facebook’s M is expected to be available to hundreds of millions on Facebook Messenger in 2017.



Cortana is an operating system-oriented voice assistant available on Windows 10 devices, as well as the Xbox One console. Cortana is closely connected to productivity, but can also help answer more general questions by pulling information from Bing.

The Cortana VA has seen a lot of recent growth, expanding her use throughout Windows 10 and related services. Combined with newer offerings like Surface Studio, its clear Microsoft favors Cortana as an OS-based service to control Windows 10 while one is working.

While user can store specific bits of information with Cortana, Microsoft’s virtual assistant is constantly analyzing user’s interactions to learn more about him/her. This info is stored in something Microsoft calls the “Notebook,” which includes the places user likes to go, people he/she care about, user’s preferred quiet hours, and things he/she might be interested in, among other things. User can even edit it if he like.

Cortana can user’s emails, track user’s location, watch user’s browsing history, check user’s contact list, keep an eye on user’s calendar, and put all this data together to suggest useful info, if user allow it to. Cortana is designed to recognize context, so it should be able to understand follow-up requests, and you can phrase things in different ways and still expect a useful answer. User can also type his/her questions or requests, if you prefer to not speak out loud.

The latest changes from the Windows 10 Creators Update allow Cortana to help in the setup process for new computers, and include a new full screen mode for Cortana that serves as both a screensaver and voice-assistant focused mode when user is away from the computer—or is too far away to type. Cortana can also handle music and reminder commands more effectively, spanning multiple music apps and controlling volume as user desire.



Siri has been an integral part of iOS since the launch of iOS 5 in 2011. It started with the basics such as weather and messaging, but has expanded greatly since then to support more third-party integration with MacOS.

While Siri’s jokes are legendary, the virtual assistant is getting more capable every day. Now, user can ask it to call people, send messages, schedule meetings, launch apps and games, play music, answer questions, set reminders, and provide weather forecasts.

Siri can also integrate with third-party apps and understand follow-up queries. That’s a big change in strategy for Apple, which typically maintains a tight grip on which third-party companies get access to its native functions.

Siri is probably the most familiar of all the voice assistants. It also lags behind the other VAs when it comes to text input, which isn’t supported for most Siri functions. Apple appears to be using Siri for voice controls and Spotlight for similar text-based queries.

The latest news for Siri includes voice compatibility for WhatsApp, expanded payment options for Lyft and Uber, and the ability to look up international cricket scores. These are minor tweaks compared to the changes other VAs are going through, but they also point to Siri’s continued stability—particularly for long-term iOS users who already know the voice assistant well.


Google Assistant

Google Assistant (which has incorporated functions from the older Google Now, as Now is being phased out) is different from Cortana and Siri. It has less personality, but more functionality. While it is an integral part of Android, Google Assistant also lives in an iOS app, and can be accessed through the Chrome browser as needed.

Like Cortana and Siri, you can ask Assistant for directions to the closest Chinese restaurant, or what the weather looks like for the next 10 days. If you let it, Google’s software will utilize your search history and customize its responses based on what it knows about your queries.

Google’s integration with its search engine makes Google Assistant one of the most useful virtual assistants out of the box. It already has a treasure trove of data on what you’ve done on the web. It also reacts to questions in a similar way to the Google browser, which makes it great for general information and trivia.



It is Amazon’s voice assistant and it isn’t focused on mobile or computer purposes, but rather for the standalone Amazon Echo speaker and a limited number of Amazon Fire devices, with a greater concentration on whole-house management and services rather than computer-oriented tasks.

Obviously, this limits Alexa compared to the alternatives. However, there are some advantages to the Amazon approach. Like Assistant, Alexa is highly conversational, and its ability to parse meaning is frequently excellent, whether you’re asking about the weather or listening to the latest news summaries from around the web. Alexa is meant to be used out in the open, away from the computer, while you’re working elsewhere but still need information, entertainment, or purchases.

The customization and management options for Alexa also impress. While other voice assistants hide many of their capabilities away from users, Alexa brings them all out in the form of “skills” and connections. The Alexa app allows you to add various mini-apps in the form of skills, and adjust current services and settings using these skills. It’s a great system, especially for those who like to tinker, but it does require learning a new approach to VA management.

Amazon is also doing a lot of work to bring Alexa into more mobile situations: The Alexa app, for example, brings many of its capabilities to your phone so you can organize lists while driving or control smart home features away from an Echo.




Not to be outdone in the voice assistant game, Samsung has also created a mobile device assistant called Bixby, which now has full voice command compatibility (if you’ve picked up a Galaxy S8, you’ve probably encountered it). In general, Bixby shares a lot in common with Cortana. The VA lingers on the Galaxy phone, ready to access information and manage your data, schedule, events, and more. It doesn’t venture out into the Internet of Things much, but it does have an impressive amount of control over everything you do on your Samsung device.

You can divide Bixby into three basic different categories of abilities—Voice, Home, and Vision. They all work together, but use different Bixby abilities:

Voice includes both questions—”What’s the weather today?”—and commands. Start by saying “Hey Bixby” and you can get general information or facts. However, like Cortana, Bixby also excels at operating software, so you can also use it to control the Galaxy menus, change settings, set reminders, take pictures, edit video, and much, much more. If you’ve ever wanted to operate your smartphone hands free, there’s a lot to explore here. Some functionality goes even deeper – you can ask Bixby to read out your latest emails, or tell it to post your photo to Instagram, and Bixby will do so.

Home is the app face of Bixby, a screen that provides information based on what you have asked Bixby about in the past, as well as the different services that Bixby can control with the right compatibility—Including Facebook, CNN, and Spotify. In the future this area may include smart home capabilities (Samsung says it’s on the way), but for now it’s relegated to basic online services.

Vision is the most unique part of Bixby, as it can analyze what image the camera is picking up and give you a report on it. When this works (say, looking at a recognizable logo) Bixby can help you instantly compare online prices to in-store prices, or give you more information about local landmarks. If this feature takes off, other voice assistants may start getting jealous.