Tag Archive | "want"

Want Better Results? Ask Better Questions. Here’s How

First things first: Our workshop on effective selling with Tim Paige is back on the schedule! We had to adjust the calendar, but we’ve got Tim set to teach us his low-pressure but effective techniques for sales. We’ll host the workshop (it’s free) on Tuesday, June 26 at 12:00 Noon Eastern U.S. Time. I’ve had
Read More…

The post Want Better Results? Ask Better Questions. Here’s How appeared first on Copyblogger.


Copyblogger

Related Articles

Posted in Latest NewsComments Off

Want to target position 0? Here’s what you need to make that happen

Hey Google, how do you become the answer people hear on their voice assistants? Contributor Karen Bone explains how to make that happen by doing your homework on featured snippets.

The post Want to target position 0? Here’s what you need to make that happen appeared first on Search Engine…



Please visit Search Engine Land for the full article.


Search Engine Land: News & Info About SEO, PPC, SEM, Search Engines & Search Marketing

Posted in Latest NewsComments Off

Want to Speak at MozCon 2018? Here’s Your Chance – Pitch to Be a Community Speaker!

Posted by Danielle_Launders

MozCon 2018 is nearing and it’s almost time to brush off that microphone. If speaking at MozCon is your dream, then we have the opportunity of a lifetime for you! Pitch us your topic and you may be selected to join us as one of our six community speakers.

What is a community speaker, you ask? MozCon sessions are by invite only, meaning we reach out to select speakers for the majority of our talks. But every year we reserve six 15-minute community speaking slots, where we invite anyone in the SEO community to pitch to present at MozCon. These sessions are both an attendee favorite and a fabulous opportunity to break into the speaking circuit.

Katie Cunningham, one of last year’s community speakers, on stage at MozCon 2017

Interested in pitching your own idea? Read on for everything you need to know:

The details

  • Fill out the community speaker submission form
  • Only one submission per person — make sure to choose the one you’re most passionate about!
  • Pitches must be related to online marketing and for a topic that can be covered in 15 minutes
  • Submissions close on Sunday, April 22nd at 5pm PDT
  • All decisions are final
  • All speakers must adhere to the MozCon Code of Conduct
  • You’ll be required to present in Seattle at MozCon

Ready to pitch your idea?

If you submit a pitch, you’ll hear back from us regardless of your acceptance status.

What you’ll get as a community speaker:

  • 15 minutes on the MozCon stage for a keynote-style presentation, followed by 5 minutes of Q&A
  • A free ticket to MozCon (we can issue a refund or transfer if you have already purchased yours)
  • Four nights of lodging covered by Moz at our partner hotel
  • Reimbursement for your travel — up to $ 500 for domestic and $ 750 for international travel
  • An additional free MozCon ticket for you to give away, plus a code for $ 300 off of one ticket
  • An invitation for you and your significant other to join us for the pre-event speakers dinner

The selection process:

We have an internal committee of Mozzers that review every pitch. In the first phase we review only the topics to ensure that they’re a good fit for our audience. After this first phase, we look at the entirety of the pitch to help us get a comprehensive idea of what to expect from your talk on the MozCon stage.

Want some advice for perfecting your pitch?

  • Keep your pitch focused to online marketing. The more actionable the pitch, the better.
  • Be detailed! We want to know the actual tactics our audience will be learning about. Remember, we receive a ton of pitches, so the more you can explain, the better!
  • Review the topics already being presented — we’re looking for something new to add to the stage.
  • Keep the pitch to under 1200 characters. We’re strict with the word limits — even the best pitches will be disqualified if they don’t abide by the rules.
  • No pitches will be evaluated in advance, so please don’t ask :)
  • Using social media to lobby your pitch won’t help. Instead, put your time and energy into the actual pitch itself!
  • Linking to a previous example of a slide deck or presentation isn’t required, but it does help the committee a ton.

You’ve got this!

This could be you.

If your pitch is selected, the MozCon team will help you along the way. Whether this is your first time on stage or your twentieth, we want this to be your best talk to date. We’re here to answer questions that may come up and to work with you to deliver something you’re truly proud of. Here are just a handful of ways that we’re here to help:

  • Topic refinement
  • Helping with your session title and description
  • Reviewing any session outlines and drafts
  • Providing plenty of tips around best practices — specifically with the MozCon stage in mind
  • Comprehensive show guide
  • Being available to listen to you practice your talk
  • Reviewing your final deck
  • A full stage tour on Sunday to meet our A/V crew, see your presentation on the big screens, and get a feel for the show
  • An amazing 15-person A/V team

Make your pitch to speak at MozCon!

We can’t wait to see what y’all come up with. Best of luck!

Sign up for The Moz Top 10, a semimonthly mailer updating you on the top ten hottest pieces of SEO news, tips, and rad links uncovered by the Moz team. Think of it as your exclusive digest of stuff you don’t have time to hunt down but want to read!


Moz Blog

Posted in Latest NewsComments Off

3 False Beliefs about Conversational Copywriting that Make Me Want to Scream

Before I get into what makes me scream, shout, and reach for hard objects to throw, let me be clear about my definition of “conversational copywriting.” It’s a way of writing sales copy that sounds like one friend enthusiastically selling something to another friend. Conversational copywriting is still about selling … but in a way
Read More…

The post 3 False Beliefs about Conversational Copywriting that Make Me Want to Scream appeared first on Copyblogger.


Copyblogger

More Articles

Posted in Latest NewsComments Off

Killer Resources for Freelancers … and an Option for Those Who Don’t Want to Go It Alone

This week, Stefanie Flaxman and I yielded the floor to a pair of smart gentlemen who we don’t hear from quite as often as we used to. And we featured a writer you haven’t seen on Copyblogger before. Her debut post for us is a must-read for writers who like being able to pay their
Read More…

The post Killer Resources for Freelancers … and an Option for Those Who Don’t Want to Go It Alone appeared first on Copyblogger.


Copyblogger

Posted in Latest NewsComments Off

So You Want to Build a Chat Bot – Here’s How (Complete with Code!)

Posted by R0bin_L0rd

You’re busy and (depending on effective keyword targeting) you’ve come here looking for something to shave months off the process of learning to produce your own chat bot. If you’re convinced you need this and just want the how-to, skip to “What my bot does.” If you want the background on why you should be building for platforms like Google Home, Alexa, and Facebook Messenger, read on.

Why should I read this?

Do you remember when it wasn’t necessary to have a website? When most boards would scoff at the value of running a Facebook page? Now Gartner is telling us that customers will manage 85% of their relationship with brands without interacting with a human by 2020 and publications like Forbes are saying that chat bots are the cause.

The situation now is the same as every time a new platform develops: if you don’t have something your customers can access, you’re giving that medium to your competition. At the moment, an automated presence on Google Home or Slack may not be central to your strategy, but those who claim ground now could dominate it in the future.

The problem is time. Sure, it’d be ideal to be everywhere all the time, to have your brand active on every platform. But it would also be ideal to catch at least four hours sleep a night or stop covering our keyboards with three-day-old chili con carne as we eat a hasty lunch in between building two of the Next Big Things. This is where you’re fortunate in two ways;

  1. When we develop chat applications, we don’t have to worry about things like a beautiful user interface because it’s all speech or text. That’s not to say you don’t need to worry about user experience, as there are rules (and an art) to designing a good conversational back-and-forth. Amazon is actually offering some hefty prizes for outstanding examples.
  2. I’ve spent the last six months working through the steps from complete ignorance to creating a distributable chat bot and I’m giving you all my workings. In this post I break down each of the levels of complexity, from no-code back-and-forth to managing user credentials and sessions the stretch over days or months. I’m also including full code that you can adapt and pull apart as needed. I’ve commented each portion of the code explaining what it does and linking to resources where necessary.

I’ve written more about the value of Interactive Personal Assistants on the Distilled blog, so this post won’t spend any longer focusing on why you should develop chat bots. Instead, I’ll share everything I’ve learned.

What my built-from-scratch bot does

Ever since I started investigating chat bots, I was particularly interested in finding out the answer to one question: What does it take for someone with little-to-no programming experience to create one of these chat applications from scratch? Fortunately, I have direct access to someone with little-to-no experience (before February, I had no idea what Python was). And so I set about designing my own bot with the following hard conditions:


  1. It had to have some kind of real-world application. It didn’t have to be critical to a business, but it did have to bear basic user needs in mind.
  2. It had to be easily distributable across the immediate intended users, and to have reasonable scope to distribute further (modifications at most, rather than a complete rewrite).
  3. It had to be flexible enough that you, the reader, can take some free code and make your own chat bot.
  4. It had to be possible to adapt the skeleton of the process for much more complex business cases.
  5. It had to be free to run, but could have the option of paying to scale up or make life easier.
  6. It had to send messages confirming when important steps had been completed.

The resulting program is “Vietnambot,” a program that communicates with Slack, the API.AI linguistic processing platform, and Google Sheets, using real-time and asynchronous processing and its own database for storing user credentials.

If that meant nothing to you, don’t worry — I’ll define those things in a bit, and the code I’m providing is obsessively commented with explanation. The thing to remember is it does all of this to write down food orders for our favorite Vietnamese restaurant in a shared Google Sheet, probably saving tens of seconds of Distilled company time every year.

It’s deliberately mundane, but it’s designed to be a template for far more complex interactions. The idea is that whether you want to write a no-code-needed back-and-forth just through API.AI; a simple Python program that receives information, does a thing, and sends a response; or something that breaks out of the limitations of linguistic processing platforms to perform complex interactions in user sessions that can last days, this post should give you some of the puzzle pieces and point you to others.

What is API.AI and what’s it used for?

API.AI is a linguistic processing interface. It can receive text, or speech converted to text, and perform much of the comprehension for you. You can see my Distilled post for more details, but essentially, it takes the phrase “My name is Robin and I want noodles today” and splits it up into components like:

  • Intent: food_request
  • Action: process_food
  • Name: Robin
  • Food: noodles
  • Time: today

This setup means you have some hope of responding to the hundreds of thousands of ways your users could find to say the same thing. It’s your choice whether API.AI receives a message and responds to the user right away, or whether it receives a message from a user, categorizes it and sends it to your application, then waits for your application to respond before sending your application’s response back to the user who made the original request. In its simplest form, the platform has a bunch of one-click integrations and requires absolutely no code.

I’ve listed the possible levels of complexity below, but it’s worth bearing some hard limitations in mind which apply to most of these services. They cannot remember anything outside of a user session, which will automatically end after about 30 minutes, they have to do everything through what are called POST and GET requests (something you can ignore unless you’re using code), and if you do choose to have it ask your application for information before it responds to the user, you have to do everything and respond within five seconds.

What are the other things?

Slack: A text-based messaging platform designed for work (or for distracting people from work).

Google Sheets: We all know this, but just in case, it’s Excel online.

Asynchronous processing: Most of the time, one program can do one thing at a time. Even if it asks another program to do something, it normally just stops and waits for the response. Asynchronous processing is how we ask a question and continue without waiting for the answer, possibly retrieving that answer at a later time.

Database: Again, it’s likely you know this, but if not: it’s Excel that our code will use (different from the Google Sheet).

Heroku: A platform for running code online. (Important to note: I don’t work for Heroku and haven’t been paid by them. I couldn’t say that it’s the best platform, but it can be free and, as of now, it’s the one I’m most familiar with).

How easy is it?

This graph isn’t terribly scientific and it’s from the perspective of someone who’s learning much of this for the first time, so here’s an approximate breakdown:

Label

Functionality

Time it took me

1

You set up the conversation purely through API.AI or similar, no external code needed. For instance, answering set questions about contact details or opening times

Half an hour to distributable prototype

2

A program that receives information from API.AI and uses that information to update the correct cells in a Google Sheet (but can’t remember user names and can’t use the slower Google Sheets integrations)

A few weeks to distributable prototype

3

A program that remembers user names once they’ve been set and writes them to Google Sheets. Is limited to five seconds processing time by API.AI, so can’t use the slower Google Sheets integrations and may not work reliably when the app has to boot up from sleep because that takes a few seconds of your allocation*

A few weeks on top of the last prototype

4

A program that remembers user details and manages the connection between API.AI and our chosen platform (in this case, Slack) so it can break out of the five-second processing window.

A few weeks more on top of the last prototype (not including the time needed to rewrite existing structures to work with this)

*On the Heroku free plan, when your app hasn’t been used for 30 minutes it goes to sleep. This means that the first time it’s activated it takes a little while to start your process, which can be a problem if you have a short window in which to act. You could get around this by (mis)using a free “uptime monitoring service” which sends a request every so often to keep your app awake. If you choose this method, in order to avoid using all of the Heroku free hours allocation by the end of the month, you’ll need to register your card (no charge, it just gets you extra hours) and only run this application on the account. Alternatively, there are any number of companies happy to take your money to keep your app alive.

For the rest of this post, I’m going to break down each of those key steps and either give an overview of how you could achieve it, or point you in the direction of where you can find that. The code I’m giving you is Python, but as long as you can receive and respond to GET and POST requests, you can do it in pretty much whatever format you wish.


1. Design your conversation

Conversational flow is an art form in itself. Jonathan Seal, strategy director at Mando and member of British Interactive Media Association’s AI thinktank, has given some great talks on the topic. Paul Pangaro has also spoken about conversation as more than interface in multiple mediums.

Your first step is to create a flow chart of the conversation. Write out your ideal conversation, then write out the most likely ways a person might go off track and how you’d deal with them. Then go online, find existing chat bots and do everything you can to break them. Write out the most difficult, obtuse, and nonsensical responses you can. Interact with them like you’re six glasses of wine in and trying to order a lemon engraving kit, interact with them as though you’ve found charges on your card for a lemon engraver you definitely didn’t buy and you are livid, interact with them like you’re a bored teenager. At every point, write down what you tried to do to break them and what the response was, then apply that to your flow. Then get someone else to try to break your flow. Give them no information whatsoever apart from the responses you’ve written down (not even what the bot is designed for), refuse to answer any input you don’t have written down, and see how it goes. David Low, principal evangelist for Amazon Alexa, often describes the value of printing out a script and testing the back-and-forth for a conversation. As well as helping to avoid gaps, it’ll also show you where you’re dumping a huge amount of information on the user.

While “best practices” are still developing for chat bots, a common theme is that it’s not a good idea to pretend your bot is a person. Be upfront that it’s a bot — users will find out anyway. Likewise, it’s incredibly frustrating to open a chat and have no idea what to say. On text platforms, start with a welcome message making it clear you’re a bot and giving examples of things you can do. On platforms like Google Home and Amazon Alexa users will expect a program, but the “things I can do” bit is still important enough that your bot won’t be approved without this opening phase.

I’ve included a sample conversational flow for Vietnambot at the end of this post as one way to approach it, although if you have ideas for alternative conversational structures I’d be interested in reading them in the comments.

A final piece of advice on conversations: The trick here is to find organic ways of controlling the possible inputs and preparing for unexpected inputs. That being said, the Alexa evangelist team provide an example of terrible user experience in which a bank’s app said: “If you want to continue, say nine.” Quite often questions, rather than instructions, are the key.

2. Create a conversation in API.AI

API.AI has quite a lot of documentation explaining how to create programs here, so I won’t go over individual steps.

Key things to understand:

You create agents; each is basically a different program. Agents recognize intents, which are simply ways of triggering a specific response. If someone says the right things at the right time, they meet criteria you have set, fall into an intent, and get a pre-set response.

The right things to say are included in the “User says” section (screenshot below). You set either exact phrases or lists of options as the necessary input. For instance, a user could write “Of course, I’m [any name]” or “Of course, I’m [any temperature].” You could set up one intent for name-is which matches “Of course, I’m [given-name]” and another intent for temperature which matches “Of course, I’m [temperature],” and depending on whether your user writes a name or temperature in that final block you could activate either the “name-is” or “temperature-is” intent.

The “right time” is defined by contexts. Contexts help define whether an intent will be activated, but are also created by certain intents. I’ve included a screenshot below of an example interaction. In this example, the user says that they would like to go to on holiday. This activates a holiday intent and sets the holiday context you can see in input contexts below. After that, our service will have automatically responded with the question “where would you like to go?” When our user says “The” and then any location, it activates our holiday location intent because it matches both the context, and what the user says. If, on the other hand, the user had initially said “I want to go to the theater,” that might have activated the theater intent which would set a theater context — so when we ask “what area of theaters are you interested in?” and the user says “The [location]” or even just “[location],” we will take them down a completely different path of suggesting theaters rather than hotels in Rome.

The way you can create conversations without ever using external code is by using these contexts. A user might say “What times are you open?”; you could set an open-time-inquiry context. In your response, you could give the times and ask if they want the phone number to contact you. You would then make a yes/no intent which matches the context you have set, so if your user says “Yes” you respond with the number. This could be set up within an hour but gets exponentially more complex when you need to respond to specific parts of the message. For instance, if you have different shop locations and want to give the right phone number without having to write out every possible location they could say in API.AI, you’ll need to integrate with external code (see section three).

Now, there will be times when your users don’t say what you’re expecting. Excluding contexts, there are three very important ways to deal with that:

  1. Almost like keyword research — plan out as many possible variations of saying the same thing as possible, and put them all into the intent
  2. Test, test, test, test, test, test, test, test, test, test, test, test, test, test, test (when launched, every chat bot will have problems. Keep testing, keep updating, keep improving.)
  3. Fallback contexts

Fallback contexts don’t have a user says section, but can be boxed in by contexts. They match anything that has the right context but doesn’t match any of your user says. It could be tempting to use fallback intents as a catch-all. Reasoning along the lines of “This is the only thing they’ll say, so we’ll just treat it the same” is understandable, but it opens up a massive hole in the process. Fallback intents are designed to be a conversational safety net. They operate exactly the same as in a normal conversation. If a person asked what you want in your tea and you responded “I don’t want tea” and that person made a cup of tea, wrote the words “I don’t want tea” on a piece of paper, and put it in, that is not a person you’d want to interact with again. If we are using fallback intents to do anything, we need to preface it with a check. If we had to resort to it in the example above, saying “I think you asked me to add I don’t want tea to your tea. Is that right?” is clunky and robotic, but it’s a big step forward, and you can travel the rest of the way by perfecting other parts of your conversation.

3. Integrating with external code

I used Heroku to build my app . Using this excellent weather webhook example you can actually deploy a bot to Heroku within minutes. I found this example particularly useful as something I could pick apart to make my own call and response program. The weather webhook takes the information and calls a yahoo app, but ignoring that specific functionality you essentially need the following if you’re working in Python:

#start
    req = request.get_json
    print("Request:")
    print(json.dumps(req, indent=4))
#process to do your thing and decide what response should be

    res = processRequest(req)
# Response we should receive from processRequest (you’ll need to write some code called processRequest and make it return the below, the weather webhook example above is a good one).
{
        "speech": “speech we want to send back”,
        "displayText": “display text we want to send back, usually matches speech”,
        "source": "your app name"
    }

# Making our response readable by API.AI and sending it back to the servic

 response = make_response(res)
    response.headers['Content-Type'] = 'application/json'
    return response
# End

As long as you can receive and respond to requests like that (or in the equivalent for languages other than Python), your app and API.AI should both understand each other perfectly — what you do in the interim to change the world or make your response is entirely up to you. The main code I have included is a little different from this because it’s also designed to be the step in-between Slack and API.AI. However, I have heavily commented sections like like process_food and the database interaction processes, with both explanation and reading sources. Those comments should help you make it your own. If you want to repurpose my program to work within that five-second window, I would forget about the file called app.py and aim to copy whole processes from tasks.py, paste them into a program based on the weatherhook example above, and go from there.

Initially I’d recommend trying GSpread to make some changes to a test spreadsheet. That way you’ll get visible feedback on how well your application is running (you’ll need to go through the authorization steps as they are explained here).

4. Using a database

Databases are pretty easy to set up in Heroku. I chose the Postgres add-on (you just need to authenticate your account with a card; it won’t charge you anything and then you just click to install). In the import section of my code I’ve included links to useful resources which helped me figure out how to get the database up and running — for example, this blog post.

I used the Python library Psycopg2 to interact with the database. To steal some examples of using it in code, have a look at the section entitled “synchronous functions” in either the app.py or tasks.py files. Open_db_connection and close_db_connection do exactly what they say on the tin (open and close the connection with the database). You tell check_database to check a specific column for a specific user and it gives you the value, while update_columns adds a value to specified columns for a certain user record. Where things haven’t worked straightaway, I’ve included links to the pages where I found my solution. One thing to bear in mind is that I’ve used a way of including columns as a variable, which Psycopg2 recommends quite strongly against. I’ve gotten away with it so far because I’m always writing out the specific column names elsewhere — I’m just using that method as a short cut.

5. Processing outside of API.AI’s five-second window

It needs to be said that this step complicates things by no small amount. It also makes it harder to integrate with different applications. Rather than flicking a switch to roll out through API.AI, you have to write the code that interprets authentication and user-specific messages for each platform you’re integrating with. What’s more, spoken-only platforms like Google Home and Amazon Alexa don’t allow for this kind of circumvention of the rules — you have to sit within that 5–8 second window, so this method removes those options. The only reasons you should need to take the integration away from API.AI are:

  • You want to use it to work with a platform that it doesn’t have an integration with. It currently has 14 integrations including Facebook Messenger, Twitter, Slack, and Google Home. It also allows exporting your conversations in an Amazon Alexa-understandable format (Amazon has their own similar interface and a bunch of instructions on how to build a skill — here is an example.
  • You are processing masses of information. I’m talking really large amounts. Some flight comparison sites have had problems fitting within the timeout limit of these platforms, but if you aren’t trying to process every detail for every flight for the next 12 months and it’s taking more than five seconds, it’s probably going to be easier to make your code more efficient than work outside the window. Even if you are, those same flight comparison sites solved the problem by creating a process that regularly checks their full data set and creates a smaller pool of information that’s more quickly accessible.
  • You need to send multiple follow-up messages to your user. When using the API.AI integration it’s pretty much call-and-response; you don’t always get access to things like authorization tokens, which are what some messaging platforms require before you can automatically send messages to one of their users.
  • You’re working with another program that can be quite slow, or there are technical limitations to your setup. This one applies to Vietnambot, I used the GSpread library in my application, which is fantastic but can be slow to pull out bigger chunks of data. What’s more, Heroku can take a little while to start up if you’re not paying.

I could have paid or cut out some of the functionality to avoid needing to manage this part of the process, but that would have failed to meet number 4 in our original conditions: It had to be possible to adapt the skeleton of the process for much more complex business cases. If you decide you’d rather use my program within that five-second window, skip back to section 2 of this post. Otherwise, keep reading.

When we break out of the five-second API.AI window, we have to do a couple of things. First thing is to flip the process on its head.

What we were doing before:

User sends message -> API.AI -> our process -> API.AI -> user

What we need to do now:

User sends message -> our process -> API.AI -> our process -> user

Instead of API.AI waiting while we do our processing, we do some processing, wait for API.AI to categorize the message from us, do a bit more processing, then message the user.

The way this applies to Vietnambot is:

  1. User says “I want [food]”
  2. Slack sends a message to my app on Heroku
  3. My app sends a “swift and confident” 200 response to Slack to prevent it from resending the message. To send the response, my process has to shut down, so before it does that, it activates a secondary process using “tasks.”
  4. The secondary process takes the query text and sends it to API.AI, then gets back the response.
  5. The secondary process checks our database for a user name. If we don’t have one saved, it sends another request to API.AI, putting it in the “we don’t have a name” context, and sends a message to our user asking for their name. That way, when our user responds with their name, API.AI is already primed to interpret it correctly because we’ve set the right context (see section 1 of this post). API.AI tells us that the latest message is a user name and we save it. When we have both the user name and food (whether we’ve just got it from the database or just saved it to the database), Vietnambot adds the order to our sheet, calculates whether we’ve reached the order minimum for that day, and sends a final success message.

6. Integrating with Slack

This won’t be the same as integrating with other messaging services, but it could give some insight into what might be required elsewhere. Slack has two authorization processes; we’ll call one “challenge” and the other “authentication.”

Slack includes instructions for an app lifecycle here, but API.AI actually has excellent instructions for how to set up your app; as a first step, create a simple back-and-forth conversation in API.AI (not your full product), go to integrations, switch on Slack, and run through the steps to set it up. Once that is up and working, you’ll need to change the OAuth URL and the Events URL to be the URL for your app.

Thanks to github user karishay, my app code includes a process for responding to the challenge process (which will tell Slack you’re set up to receive events) and for running through the authentication process, using our established database to save important user tokens. There’s also the option to save them to a Google Sheet if you haven’t got the database established yet. However, be wary of this as anything other than a first step — user tokens give an app a lot of power and have to be guarded carefully.

7. Asynchronous processing

We are running our app using Flask, which is basically a whole bunch of code we can call upon to deal with things like receiving requests for information over the internet. In order to create a secondary worker process I’ve used Redis and Celery. Redis is our “message broker”; it makes makes a list of everything we want our secondary process to do. Celery runs through that list and makes our worker process do those tasks in sequence. Redis is a note left on the fridge telling you to do your washing and take out the bins, while Celery is the housemate that bangs on your bedroom door, note in hand, and makes you do each thing. I’m sure our worker process doesn’t like Celery very much, but it’s really useful for us.

You can find instructions for adding Redis to your app in Heroku here and you can find advice on setting up Celery in Heroku here. Miguel Grinberg’s Using Celery with Flask blog post is also an excellent resource, but using the exact setup he gives results in a clash with our database, so it’s easier to stick with the Heroku version.

Up until this point, we’ve been calling functions in our main app — anything of the form function_name(argument_1, argument_2, argument_3). Now, by putting “tasks.” in front of our function, we’re saying “don’t do this now — hand it to the secondary process.” That’s because we’ve done a few things:

  • We’ve created tasks.py which is the secondary process. Basically it’s just one big, long function that our main code tells to run.
  • In tasks.py we’ve included Celery in our imports and set our app as celery.Celery(), meaning that when we use “app” later we’re essentially saying “this is part of our Celery jobs list” or rather “tasks.py will only do anything when its flatmate Celery comes banging on the door”
  • For every time our main process asks for an asynchronous function by writing tasks.any_function_name(), we have created that function in our secondary program just as we would if it were in the same file. However in our secondary program we’ve prefaced with “@app.task”, another way of saying “Do wash_the_dishes when Celery comes banging the door yelling wash_the_dishes(dishes, water, heat, resentment)”.
  • In our “procfile” (included as a file in my code) we have listed our worker process as –app=tasks.app

All this adds up to the following process:

  1. Main program runs until it hits an asynchronous function
  2. Main program fires off a message to Redis which has a list of work to be done. The main process doesn’t wait, it just runs through everything after it and in our case even shuts down
  3. The Celery part of our worker program goes to Redis and checks for the latest update, it checks what function has been called (because our worker functions are named the same as when our main process called them), it gives our worker all the information to start doing that thing and tells it to get going
  4. Our worker process starts the action it has been told to do, then shuts down.

As with the other topics mentioned here, I’ve included all of this in the code I’ve supplied, along with many of the sources used to gather the information — so feel free to use the processes I have. Also feel free to improve on them; as I said, the value of this investigation was that I am not a coder. Any suggestions for tweaks or improvements to the code are very much welcome.


Conclusion

As I mentioned in the introduction to this post, there’s huge opportunity for individuals and organizations to gain ground by creating conversational interactions for the general public. For the vast majority of cases you could be up and running in a few hours to a few days, depending on how complex you want your interactions to be and how comfortable you are with coding languages. There are some stumbling blocks out there, but hopefully this post and my obsessively annotated code can act as templates and signposts to help get you on your way.

Grab my code at GitHub


Bonus #1: The conversational flow for my chat bot

This is by no means necessarily the best or only way to approach this interaction. This is designed to be as streamlined an interaction as possible, but we’re also working within the restrictions of the platform and the time investment necessary to produce this. Common wisdom is to create the flow of your conversation and then keep testing to perfect, so consider this example layout a step in that process. I’d also recommend putting one of these flow charts together before starting — otherwise you could find yourself having to redo a bunch of work to accommodate a better back-and-forth.

Bonus #2: General things I learned putting this together

As I mentioned above, this has been a project of going from complete ignorance of coding to slightly less ignorance. I am not a professional coder, but I found the following things I picked up to be hugely useful while I was starting out.

  1. Comment everything. You’ll probably see my code is bordering on excessive commenting (anything after a # is a comment). While normally I’m sure someone wouldn’t want to include a bunch of Stack Overflow links in their code, I found notes about what things portions of code were trying to do, and where I got the reasoning from, hugely helpful as I tried to wrap my head around it all.
  2. Print everything. In Python, everything within “print()” will be printed out in the app logs (see the commands tip for reading them in Heroku). While printing each action can mean you fill up a logging window terribly quickly (I started using the Heroku add-on LogDNA towards the end and it’s a huge step up in terms of ease of reading and length of history), often the times my app was falling over was because one specific function wasn’t getting what it needed, or because of another stupid typo. Having a semi-constant stream of actions and outputs logged meant I could find the fault much more quickly. My next step would probably be to introduce a way of easily switching on and off the less necessary print functions.
  3. The following commands: Heroku’s how-to documentation for creating an app and adding code is pretty great, but I found myself using these all the time so thought I’d share (all of the below are written in the command line; type cmd in on Windows or by running Terminal on a Mac):
    1. CD “””[file location]””” - select the file your code is in
    2. “git init” – create a git file to add to
    3. “git add .” – add all of the code in your file into the file that git will put online
    4. “git commit -m “[description of what you’re doing]” “ - save the data in your git file
    5. “heroku git:remote -a [the name of your app]” – select your app as where to put the code
    6. “git push heroku master” - send your code to the app you selected
    7. “heroku ps” – find out whether your app is running or crashed
    8. “heroku logs” – apologize to your other half for going totally unresponsive for the last ten minutes and start the process of working through your printouts to see what has gone wrong
  4. POST requests will always wait for a response. Seems really basic — initially I thought that by just sending a POST request and not telling my application to wait for a response I’d be able to basically hot-potato work around and not worry about having to finish what I was doing. That’s not how it works in general, and it’s more of a symbol of my naivete in programming than anything else.
  5. If something is really difficult, it’s very likely you’re doing it wrong.
    While I made sure to do pretty much all of the actual work myself (to
    avoid simply farming it out to the very talented individuals at
    Distilled), I was lucky enough to get some really valuable advice. The
    piece of advice above was from Dominic Woodman, and I should have
    listened to it more. The times when I made least progress were when I
    was trying to use things the way they shouldn’t be used. Even when I
    broke through those walls, I later found that someone didn’t want me to
    use it that way because it would completely fail at a later point.
    Tactical retreat
    is an option. (At this point, I should mention he wasn’t
    the only one to give invaluable advice; Austin, Tom, and Duncan of the
    Distilled R&D team were a huge help.)

Sign up for The Moz Top 10, a semimonthly mailer updating you on the top ten hottest pieces of SEO news, tips, and rad links uncovered by the Moz team. Think of it as your exclusive digest of stuff you don’t have time to hunt down but want to read!


Moz Blog

Posted in Latest NewsComments Off

How to Create (and Sell) Products People Actually Want to Buy

This week offers a mix of inspiration, clarity, purpose … and some good, old-fashioned results-oriented copywriting. On Monday, I shared some of the practical, repeatable steps you can use to create an online course that people actually want to buy. (That’s a fun thing to do, by the way, and I totally recommend it.) Brian
Read More…

The post How to Create (and Sell) Products People Actually Want to Buy appeared first on Copyblogger.


Copyblogger

Posted in Latest NewsComments Off

How to Add Color and Richness to Your Writing … Without Making Us Want to Barf

"Don't tell me it's 'awesome,' 'epic,' or 'amazing.' Show me why." – Sonia Simone

Your job as a writer is to make your subjects clear and interesting.

Assuming you aren’t working on the next Waiting for Godot, you’ll work to make sure your meaning is clear and easy to grasp.

And assuming you aren’t editing Wikipedia, you’ll work to make it lively and fresh.

But sometimes, well-meaning attempts to give your writing life end up producing writing that’s silly, trivial, cluttered, or condescending.

Lively writing is wonderful. Paragraph after paragraph of neon-rainbow unicorn vomit (with glitter) is less wonderful.

Even if you like sparkle (I do), you just need a little. Too much glitter always looks cheap.

So let’s look at how to make your writing colorful and interesting … without making your audience sick to their stomachs.

The most important thing

Before we start, I want to be completely clear:

I don’t get to dictate what works for your audience.

I can show you some common pitfalls, but if your audience adores something I don’t like — their vote is the one that counts.

Now that we’ve got that out of the way, let’s look at some of the contributors to unicorn vomit.

A warm and personal voice is good

Nearly any content (including B2B) benefits from a warm, individual voice.

If you think about your professional life, you know that it’s possible to be absolutely professional and still be warm and likable. That’s the tone you’re after. No matter what kind of content you create, your audience is made of individual human beings.

I like to think about having a coffee (or a glass of wine) with a friend and offering my explanation of the topic I’m writing about. I’ll include conversational asides as they make sense … but I’ll often go back and delete about half of them.

Kindergarten cheerfulness is not so good

Things get ugly when we cross the line into Dora the Explorer territory.

Forced, candy-colored cheerfulness will make your content look repetitive, lightweight, and grating. Please remember that your audience is made of adults.

If you’re a member of Team Relentless Cheer, you might benefit from the following:

  • Stick to one exclamation point per article. Zero would also be fine.
  • A few conversational asides in your article are fine, but if you love them, follow my lead and cut at least half.
  • Avoid at all costs the terms Buddy, Ninja, Rockstar, and BFF.
  • Positivity is great, but reality is even better. Write about problems, too.
  • Don’t tell me it’s “awesome,” “epic,” or “amazeballs.” Show me why.
  • Probably you and I should both pare down our attachment to emojis

Our gentleman content creators sometimes suffer from a variant of this: Gary Vee syndrome.

If your content is an endless stream of ALL CAPS, exclamation points, bossy but earnest pronouncements, and addressing your audience as My Friends, please remember that there is one Gary Vee. And it is not you.

Web clichés that should die in a fire

We already talked about Ninja, Rockstar, and BFF.

Let’s add the tossed alphabet salad of BTW, TFW, TBH, AFAIK, and WTF.

We’re all citizens of this world wide web. It’s part of our identity, particularly for content creators. And our tribe has a distinct language. A language made up by people too lazy to spell things.

One or two make your content feel conversational. Too many and my eyelids start to flutter from TL;DR.

(By the way, if you’re not sure what some of these mean … LMGTFY.)

Richness and color are good

So much content looks like it’s actively trying to win a World’s Dullest Website competition.

There are plenty of facts out there, even if we leave out the “alternative” kind. There’s no shortage of sites for basic instructions, stripped-down numbers, and raw information. We’re all a few seconds away from knowing how long the gestation period of the American Crocodile is.

You can’t compete with Wikipedia and you shouldn’t try. Focus on where you can compete — with an original human voice, using the power of your point of view.

Don’t just tell us what the numbers are … tell us why they matter.

Don’t just analyze … make it vivid.

Use texture, storytelling, slang, analogy, metaphor, nuance, and connotation to sculpt a three-dimensional understanding of your topic.

Sensory language helps create vivid impressions. Think about smells, tastes, and colors.

“Loaded” language carries firepower. Calling something pallid or bleached carries a different connotation than the generic light-colored.

Make sure your nouns and verbs are working hard. Sensory, specific, and concrete language gives writing flavor.

Don’t say The deliciously-scented intricate purple flower. Say The lilac.

Goop is not so good

If you’d like to improve your writing and spend a delightful half-hour at the same time, I encourage you to take a look at the winners of the 2016 Bulwer-Lytton contest. I present just one particularly appealing example:

“After his seventh shot of Jack Daniels, Billy reflected that only a certain kind of man, a Roman Catholic priest, born under the sign of Gemini, whose loved one had been run down by a bus full of inebriated Lazio supporters on a glorious Sunday morning in early April outside a provincial church whose bells were ringing Bach’s Tocatta and Fugue in B minor, would be able to truly understand the abyss of despair in which he was drowning.”

– Neil T. Godden, Nouméa, New Caledonia

Trying to make your writing vivid by pouring on a thick layer of verbal goop will only make it indigestible.

Make sure all of your adjectives and adverbs need to be there. You don’t have to declare war on them, but you should give each one a good stink-eye to make sure it’s pulling its weight.

Fancy Nancy word choice

Do you always have a penchant for doing things, instead of just liking them?

Do you think canapés taste better than snacks and prefer traveling in a vehicle to a car?

You may be suffering from Fancy Nancyism.

Just like glitter — a little can add sparkle. I love unusual and interesting words, too. But too many and you start to look silly.

When writing in English, keep most of your word choices to the plain, straightforward Anglo-Saxon.

  • House is better than residence.
  • Smell is better than odor. When appropriate, stink is even better.
  • Eat is better than partake.

One advantage is that when you do choose a word that’s a bit … luminous, it will stand out.

Vulnerability is good …

Perfect people are boring. And annoying. Most of us are a little fed up with the glossy, the over-curated, and the Instagram-perfect.

If you want to make a connection with an audience, go ahead and talk about problems. If you have insecurities, open up about them. (If you don’t have any insecurities, maybe you should.)

No one becomes an authority without stepping in some stinky stuff. Talk about that. Get real about the whole path that led you to where you are, not just the prettiest views along the way.

Train wrecks are not so good

When do we cross the line from vulnerable leader to oversharing whack job?

I’d argue it’s when you cease to come across as someone your audience can rely on.

Are you a freelancer who goes on and on about how you can’t meet your deadlines? Get a Freedom account, block your access to Facebook, and fix the problem. Clients don’t need another flaky freelancer.

Are you a therapist who flies off the handle over trivia and seems to lurch from one disaster to another? That’s work to save for your therapist. Your clients need to know you can help them with their problems.

It’s a bit like parenting. It’s good to let our kids know that we made mistakes, too … but if they start feeling like they need to parent us, we need to remember which one is the adult.

Your audience isn’t your support group. You’re there to help them, not the other way around.

Of course, seek out a real support group for the tough days. Everyone goes through tough times. Share your troubles with the right people.

How about you?

What are your favorite ways to bring some color into your writing?

Got a little Fancy Nancy or Dora the Explorer going on in your content? You’re among friends here — let us know in the comments. :)

The post How to Add Color and Richness to Your Writing … Without Making Us Want to Barf appeared first on Copyblogger.


Copyblogger

Posted in Latest NewsComments Off

3 Ways to Get What You Want by Doing Your Homework

"I can't tell you how many cold sales emails I get from people who demonstrate they have no idea what my company does." – Sonia Simone

Polly Professional has a lot going on today. She has a blog post due, a podcast script to write, an employee review to conduct, two client meetings, and she’s meeting her cousin Penny for dinner.

And then it comes. Ding.

An email from Steve Stranger.

Maybe he’s a sales pro trying to set up a “quick meeting to discuss his company’s solutions,” but it’s clear he has no idea what her company does or what Polly’s role is. Or maybe he needs a job, and he figures that being her second-cousin’s college roommate has got to qualify him for something. Or he wants to write for her company’s blog, even though he doesn’t understand the audience or the topic.

Worst of all: Maybe he wants to pick her brain.

Polly grits her teeth and counts to 10, then deletes the message. She considers marking it as spam, but she’s feeling kind-hearted today.

But she is never, ever going to answer Steve’s email.

Why? Because Steve failed to respect her time. He didn’t do his homework.

When you approach someone without doing your homework, you send a clear message: You think your time is more valuable than theirs.

It’s annoying for Polly — but it’s murder on poor Steve. Let’s face it … sometimes we need to ask folks for stuff. There’s nothing wrong with that. Helping one another out is an important part of business.

Steve could have spent a few minutes preparing for that request — and Polly would have been a lot more likely to consider it. Here’s how to do your homework, so you don’t end up like Steve.

#1: Know their work

I can’t tell you how many cold sales emails I get from people who demonstrate that they have no idea — at all — what my company does.

Unlike kind Polly, I often do mark them as spam.

When you’re approaching a person or an organization, take the time to understand their work.

If they have a blog … read it. Not just a week’s worth of posts — really look at it. Have they identified their most popular posts? Read those. Yes, all of them.

Look over their website, their podcast, their YouTube videos, their white papers — any content they’re putting out. If it’s an individual, take a look at what they post on LinkedIn or the other social platforms.

What recurring themes do they address? If their content tells stories … what’s the moral? What do they see as their unique winning difference? What kind of language do they use to talk about that?

What do they do? How does that make money? Who are their customers? How do they serve those customers?

“You can observe a lot by just watching.” – Yogi Berra

And that brings us to the second point …

#2: Know their audience

Taking some time to look through a company’s website and content is pretty common-sense, even if people often don’t do it.

But smart networkers know that it’s just the beginning.

Whether you’re trying to reach a person or an organization, take a look at who their audience is. These are readers if you’re approaching a blogger, viewers if you want to connect with a popular YouTuber, and customers if you’re approaching a business.

Influence comes from an audience. The audience is the battery of the system.

This used to be somewhat hard to do, but social media has made it much simpler.

Do they have blog comments? Read them.

Do they have a Facebook or LinkedIn presence? Tune in to the audience conversations there, not just what the influencer is saying.

And when I say “tune in,” realize I’m talking more about listening than I am about weighing in.

You can socialize later — it’s often a good idea. But first, understand who you’re socializing with.

You’re looking for what’s energizing this audience. What do they complain about? What are they worried about? What do they struggle with? What problem do they turn to this influencer or company to solve? How’s that going?

If you understand the audience, you understand the influencer. If you understand the customers, you understand the company.

#3: Play along

You won’t always have this option available to you, but if you do, take it.

What’s your influencer or organization spending a lot of time thinking about these days?

Do they have a new product launching or a big promotion running? Do they have a book out? Maybe there’s a challenge or a community event going on. Maybe they have a charity they’re doing a lot of work with.

If you can connect what you have to offer with something they care about, it’s a lot easier for them to hear what you have to say.

Please stick with what you can readily find that’s been publicly posted online, though. Homework is good … stalking is not.

Do your homework and stand out

If all of this seems like it would take a lot of time … it probably takes about as much time to approach five people intelligently as it does to approach 100 like a monkey throwing paintballs.

Those five people will be far more likely to actually stop and listen to you, because you’ve respected their time (and your own) with relevant, pertinent communication.

And you’ll stand out … because most of what’s in our inboxes is paintball after paintball.

How about you … any tips you’ve found useful on doing your homework? Let us know about them in the comments …

The post 3 Ways to Get What You Want by Doing Your Homework appeared first on Copyblogger.


Copyblogger

Posted in Latest NewsComments Off

Why a Prospect You Want Chooses Your Competitor

"No one cares about how good you are until after they know they can trust you." – Stefanie Flaxman

You had trouble sleeping again last night.

Up until the time you got into bed, you were looking at their Twitter feed, their Facebook page, and their website.

It’s your competitor.

You’re completely preoccupied with everything they do … and for a seemingly good reason. Their customer base seems to keep growing and they keep expanding their offerings, while you’re just trying to keep your head above water.

You constantly ask yourself:

“What will it take for my business to be viewed like theirs?”

While it’s natural for that question to arise in your mind, it may stifle your progress if you’re thinking in terms of duplicating their marketing efforts.

Prospects don’t want to see a carbon copy of another business and you don’t want to obsess about competitors anymore, so I’m going to show you how you can immediately become energized about and sharply focused on your own marketing ideas instead.

The heavy lifting content marketing can do for you

Brian’s recent post about how to build trust and Sonia’s post about how to stop being boring are two sides of the same content marketing strategy coin.

The benefits of creating not boring content are essentially everything you wish to achieve with content marketing.

It allows you to build an audience of interested prospects who trust you to solve their problems.

They trust you because they know your personality. They know your sense of humor. They know your favorite analogies. Your word-choice preferences. What irritates you. What warms your heart.

They want to hear from you. You’re their go-to resource.

So, if a prospect chooses a competitor over your business, it’s likely because your competitor has revealed themselves to their audience in ways that you haven’t … yet.

What’s editing got to do with it?

The example we’re going to look at today comes from the service business world — specifically an editor who offers his services to clients — but you’ll be able to see how these ideas can be applied to any niche or product.

There can be a difference between what you think your prospect needs to hear and what your prospect actually needs to hear.

In order to explain why he is qualified to edit a prospect’s writing, an editor might write on his website that:

  • He pays fierce attention to detail.
  • He is a “grammar nerd,” with extensive training and experience.
  • He loves working with writers.

And in order to explain the benefits that prospect will receive from hiring him, the editor might state:

  • Your draft will be flawless when it’s returned to you.
  • It will be returned to you on time.
  • You’ll get feedback about common mistakes you make.

All of those statements sound informative and professional, but here’s a secret about writers:

Every writer thinks their final draft is perfect. Most only have someone else edit and proofread their work for good measure.

If a writer is your prospect, you have to do something else to win her business.

No one cares about how good you are until after they know they can trust you

Those bullet points above don’t impress the prospect, and even if they did, the majority of other editors offering their services on the web make the exact same claims.

When selecting an editor, the prospect is actually concerned about the intimate act of another person — a stranger — reviewing and revising her writing.

She wants to know if she can trust the editor with her draft and if she’d like working with him. She’s less concerned about whether or not the editor knows the difference between “compliment” and “complement.”

How do you get someone to trust you?

Even though you may superficially provide the same product or service as your competitor, you choose to attract the exact right prospects for your business.

When you decide to not be boring, you step into your power as a creative content marketer — an artist who reveals himself to his audience and builds trust.

Like your favorite painter or musician.

This is the fun part.

When you create a variety of content that helps your prospects with the issues they struggle with, the most important thing to remember is:

Information does not equal content.

If someone could find what you create on Wikipedia or your competitor’s blog, your content will not be the type that builds trust over time.

The type that builds trust produces a valuable, entertaining experience for your audience member and has a clear, unique payoff.

Your content is an opportunity for you to take knowledge you’ve acquired and supercharge it with your perspective. Then you’ll share your creations to reach the people who are attracted to your communication style.

The complete package

Now, you do have to provide an outstanding product or service once a prospect accepts your offer.

That’s why an editor should know the difference between “compliment” and “complement.”

All that trust you’ve built won’t help if you don’t fulfill your promise.

But think about the powerhouse force that is in motion when you’ve built enough trust to make a sale — and then meet (or even exceed) your customer’s expectations?

You’ve become the only reasonable choice for that person and made the competition irrelevant.

And when you nurture your existing customer base, you’ll get testimonials to display on your website that further demonstrate your trustworthiness. Those happy customers will also recommend you by word of mouth if someone they know needs a product or service like yours.

It all starts with smart content.

Consider that question from earlier again:

“What will it take for my business to be viewed like theirs?”

If your competitor’s business seems less interesting now … good. You’ll have a lot more free time to get to work.

Image source: Gwen Weustink via Unsplash.

The post Why a Prospect You Want Chooses Your Competitor appeared first on Copyblogger.


Copyblogger

Posted in Latest NewsComments Off

Advert