How to Send a File to Participants After they Submit your Google Form

When someone fills out your Google Form, you may want to send a file or two to the form respondent. For instance:

  1. A school teacher can send a Word document containing a copy of the answers to students who have completed the quiz.
  2. A musician can send her latest composition as an MP3 file to users who have completed her website survey built with Google Forms.
  3. An author can email a preview copy of her upcoming book in PDF to fans who have subscribed to her newsletter.
  4. An online store may send their catalog PDF to customers who have placed orders through Google Forms.

Demo - Send Files with Google Forms

Open this Google Form, type your email address and hit the Submit button. Check your inbox and you should immediately find a PDF copy of our famous 101 useful websites collection.

How to Attach Files to Form Emails

The Email Notifications add-on for Google Forms lets you send customized emails to form respondents after a new entry is received. The same notification can also be customized to include one or more file attachments that are picked from your Google Drive and sent as an attachment in the auto-responder email.

Add File to Google Drive

  1. Go to the Google Drive website and upload any file that you wish to send via Google Forms.
  2. Change the sharing settings on the file so that it is accessible to anyone with a link. You cannot attach private files to form emails.
  3. Right-click the file in Google Drive and choose Get Link to copy the full URL of the file to the clipboard.

File Attachments in Google Drive

Configure Google Forms

  1. Go to your Google Form, and create a new email rule.
  2. Check the Notify Form Submitter option and select the form field where you ask for the email address of the form submitter.
  3. Go to the Attach Files section and paste the URL of the Google Drive file that you have copied in the previous step.

Save the rule to activate it. Submit a new form and when new users submit the form, they’ll automatically receive a copy of your file as an attachment.

Send File Attachment

PS: You may use this workflow to send files in any format including PDF, Images, Audio, Video, GIFs, PowerPoint, Excel and Word documents. The file size should be less than 5 MB. Also, it is not possible to attach native Google file formats like Google Docs, Sheets and Google Slides.

Digital Marketer at thirstyDevs Infotech

Chaim is a very Enthusiastic Digital Marketer from thirstyDevs Infotech - Hybrid Mobile App Development Company. If your business needs a Cross-Platform Compatibility Application that runs on any devices like android, iOS, Windows, Mac then our skilled group of developers gives a solution for your answer as a Hybrid App that takes your business to the next level and also helps to grow your business by providing your businesss digital face. If you need a Hybrid App for your business visits our website.

DartSass

Sass used to be a Ruby thing, but it’s been quite a while now since the Sass team has moved off Ruby to Dart, deprecating the Ruby version entirely in 2019. In fact if you npm install sass, you’ll get the DartSass version. It’s taken us a while, but now CodePen is on DartSass too.

The backstory here is that we got excited about getting Sass off Ruby too soon. Years ago now. At one point we tried to switch to NodeSass, which used LibSass (a C++ version of Sass) under the hood. But it was not a good scene. There were a variety of incompatibilities with between NodeSass and RubySass, and because there are literally hundreds of thousands of Sass Pens on CodePen and no way to explicitly pick which Sass processing those Pens use, that caused so many bugs we had to switch back to RubySass.

Fast forward to now, DartSass is entirely compatible with old RubySass, so this switchover should be safe. Hopefully entirely painless (so far so good).

The best part here is that no only will everything continue to work as you expect, but it will be faster. And more importantly, be up to date! DartSass supports things you would expect to work that just didn’t in RubySass. For example, a line like this would fail in RubySass:

div {
  width: min(50%, 500px);
}

RubySass would complain about mixed units, but this is entirely valid in CSS. DartSass now just leaves this alone, as it should, which means (trumpets) less confused users and support tickets for us.

Another tricky thing for us is that we support the (ancient!) Compass for Sass. That only works with RubySass, and we can’t just break those Pens. So, our system detects if you are trying import Compass and routes it to RubySass processor that we’ll continue to support.

It’ll be easy for us to keep Sass updated from here on out, like we do with all the other processors. That’s nice as DartSass actually ships new features, so we can make sure you have them. Speaking of other processors TypeScript is now upgraded to 4.x, and pretty much all the processors used (both in Pens and Projects) have been updated to the latest versions very recently.

The post DartSass appeared first on CodePen Blog.

DevSecOps as an Aspect of GRC

DevSecOps as an Aspect of GRC [Part 1]

Throughout the DevSecOps as an aspect of GRC article, I’ll go in-depth on how DevOps can be a key aspect of supporting corporate GRC (governance, risk, compliance) needs. Before diving into implementation steps, it’s important to understand what DevSecOps and GRC are and why they’re more important than ever. In Part 1, I’ll look at why this approach is essential for scaling digital transformation while mitigating risks.

A Perfect Storm: Balancing Innovation With Governance, Risk and Compliance

As the COVID pandemic stretches into the back half of 2020 and beyond, businesses are faced with a barrage of new challenges:

Top 5 Web Development Courses for Beginners and Programmers

Web development has become an essential part of business development. The web development process includes technical and non-technical processes, like the look and feel of the website, a process known as user experience (UX). Sometimes, a web developer might also develop applications for customers. To learn any and all of these skills, you need to take web development courses. Thousands of peoples are sharing their knowledge using online platforms. Here is the list of the seven best web development courses for beginner programmers that can help you learn web development and its essential technologies like HTML, CSS, JavaScript (JS), and JS frameworks.

Code Academy

Code Academy is one of the best web development courses and tutorials for beginners. For a beginner, it offers fundamental structures of the front-end and backend languages like CSS, HTML, Ruby, and Python. You can masters the tools used for front-end development and use server-side libraries. With Code Academy, you can learn front-end and backend development while communicating with other web developers. You even get a certificate after you complete their courses!

Collective #642



Collective 642 item image

Hotwire

Hotwire is an alternative approach to building modern web applications with Turbo at its heart, which is a set of complementary techniques for speeding up page changes and form submissions without writing any JavaScript at all.

Check it out



Collective 642 item image

AnimXYZ

The first composable CSS animation toolkit that helps you create, customize, and compose animations for your website without writing a single keyframe.

Check it out



Collective 642 item image

Santa Cruise

Help save Christmas with this fun game where you are a gift distributing Elf. By the folks of Kffein.

Play it










Collective 642 item image

Video: Using Tailwind with WordPress

Michelle Barker chats with Keith Devon and Mark Wilkinson of Highrise Digital, alongside Ben Furfie, about her experience of using Tailwind CSS for building WordPress sites.

Watch it


Collective 642 item image

Scale

One new high-quality, open-source illustration each day with the option to customize the primary color.

Check it out


Collective 642 item image

EPIC days

A great project by EPIC where they share illustrations of many international days.

Check it out








The post Collective #642 appeared first on Codrops.

Integrating TypeScript with Svelte

Svelte is one of the newer JavaScript frameworks and it’s rapidly rising in popularity. It’s a template-based framework, but one which allows for arbitrary JavaScript inside the template bindings; it has a superb reactivity story that’s simple, flexible and effective; and as an ahead-of-time (AOT) compiled framework, it has incredibly impressive perf, and bundle sizes. This post will focus on configuring TypeScript inside of Svelte templates. If you’re new to Svelte, I’d urge you to check out the introductory tutorial and docs.

If you’d like to follow along with the code (or you want to debug what you might be missing in your own project) you can clone the repo. I have branches set up to demonstrate the various pieces I’ll be going over.

Basic TypeScript and Svelte setup

Let’s look at a baseline setup. If you go to the initial-setup branch in the repo, there’s a bare Svelte project set up, with TypeScript. To be clear, TypeScript is only working in stand-alone .ts files. It’s not in any way integrated into Svelte. Accomplishing the TypeScript integration is the purpose of this post.

I’ll go over a few pieces that make Svelte and TypeScript work, mainly since I’ll be changing them in a bit, to add TypeScript support to Svelte templates.

First, I have a tsconfig.json file:

{
  "compilerOptions": {
    "module": "esNext",
    "target": "esnext",
    "moduleResolution": "node"
  },
  "exclude": ["./node_modules"]
}

This file tells TypeScript that I want to use modern JavaScript, use Node resolution, and exclude a node_modules from compilation.

Then, in typings/index.d.ts I have this:

declare module "*.svelte" {
  const value: any;
  export default value;
}

This allows TypeScript to co-exist with Svelte. Without this, TypeScript would issue errors any time a Svelte file is loaded with an import statement. Lastly, we need to tell webpack to process our Svelte files, which we do with this rule in webpack.config.js:

{
  test: /\.(html|svelte)$/,
  use: [
    { loader: "babel-loader" },
    {
      loader: "svelte-loader",
      options: {
        emitCss: true,
      },
    },
  ],
}

All of that is the basic setup for a project using Svelte components and TypeScript files. To confirm everything builds, open up a couple of terminals and run npm start in one, which will start a webpack watch, and npm run tscw in the other, to start a TypeScript watch task. Hopefully both will run without error. To really verify the TypeScript checking is running, you can change:

let x: number = 12;

…in index.ts to:

let x: number = "12";

…and see the error come up in the TypeScript watch. If you want to actually run this, you can run node server in a third terminal (I recommend iTerm2, which allows you to run these terminals inside tabs in the same window) and then hit localhost:3001.

Adding TypeScript to Svelte

Let’s add TypeScript directly to our Svelte component, then see what configuration changes we need to make it work. First go to Helper.svelte, and add lang="ts" to the script tag. That tells Svelte there’s TypeScript inside the script. Now let’s actually add some TypeScript. Let’s change the val prop to be checked as a number, via export let val: number;. The whole component now looks like this:

<script lang="ts">
  export let val: number;
</script>

<h1>Value is: {val}</h1>

Our webpack window should now have an error, but that’s expected.

Showing the terminal with an error output.

We need to tell the Svelte loader how to handle TypeScript. Let’s install the following:

npm i svelte-preprocess svelte-check --save

Now, let’s go to our webpack config file and grab svelte-preprocess:

const sveltePreprocess = require("svelte-preprocess");

…and add it to our svelte-loader:

{
  test: /\.(html|svelte)$/,
  use: [
    { loader: "babel-loader" },
    {
      loader: "svelte-loader",
      options: {
        emitCss: true,
        preprocess: sveltePreprocess({})
      },
    },
  ],
}

OK, let’s restart the webpack process, and it should build.

Add checking

So far, what we have builds, but it doesn’t check. If we have invalid code in a Svelte component, we want that to generate an error. So, let’s go to App.svelte, add the same lang="ts" to the script tag, and then pass an invalid value for the val prop, like this:

<Helper val={"3"} />

If we look in our TypeScript window, there are no errors, but there should be. It turns out we don’t type check our Svelte template with the normal tsc compiler, but with the svelte-check utility we installed earlier. Let’s stop our TypeScript watch and, in that terminal, run npm run svelte-check. That’ll start the svelte-check process in watch mode, and we should see the error we were expecting.

Showing the terminal with a caught error.

Now, remove the quotes around the 3, and the error should go away:

Showing the same terminal window, but no errors.

Neat!

In practice, we’d want both svelte-check and tsc running at the same time so we catch both errors in both our TypeScript files and Svelte templates. There’s a bunch of utilities on npm that allow can do this, or we can use iTerm2, is able to split multiple terminals in the same window. I’m using it here to run the server, webpack build, tsc build, and svelte-check build.

Showing iTerm2 window with four open terminals in a two-by-two grid.

This setup is in the basic-checking branch of the repo.

Catching missing props

There’s still one problem we need to solve. If we omit a required prop, like the val prop we just looked at, we still won’t get an error, but we should, since we didn’t assign it a default value in Helper.svelte, and is therefore required.

<Helper /> // missing `val` prop

To tell TypeScript to report this as an error, let’s go back to our tsconfig, and add two new values

"strict": true,
"noImplicitAny": false 

The first enables a bunch of TypeScript checks that are disabled by default. The second, noImplicitAny, turns off one of those strict checks. Without that second line, any variable lacking a type—which is implicitly typed as any—is now reported as an error (no implicit any, get it?)

Opinions differ widely on whether noImplicitAny should be set to true. I happen to think it’s too strict, but plenty of people disagree. Experiment and come to your own conclusion.

Anyway, with that new configuration in place, we should be able to restart our svelte-check task and see the error we were expecting.

Showing terminal with a caught error.

This setup is in the better-checking branch of the repo.

Odds and ends

One thing to be aware of is that TypeScript’s mechanism for catching incorrect properties is immediately, and irreversibly switched off for a component if that component ever references $$props or $$restProps. For example, if you were to pass an undeclared prop of, say, junk into the Helper component, you’d get an error, as expected, since that component has no junk property. But this error would immediately go away if the Helper component referenced $$props or $$restProps. The former allows you to dynamically access any prop without having an explicit declaration for it, while $$restProps is for dynamically accessing undeclared props.

This makes sense when you think about it. The purpose of these constructs is to dynamically access a property on the fly, usually for some sort of meta-programming, or to arbitrarily pass attributes on to an html element, which is common in UI libraries. The existence of either of them implies arbitrary access to a component that may not have been declared.

There’s one other common use of $$props, and that’s to access props declared as a reserved word. class is a common example of this. For example:

const className = $$props.class;

…since:

export let class = "";

…is not valid. class is a reserved word in JavaScript but there’s a workaround in this specific case. The following is also a valid way to declare that same prop—thanks to Rich Harris for helping with this.

let className;
export { className as class };

If your only use of $$props is to access a prop whose name is reserved, you can use this alternative, and maintain better type checking for your component.

Parting thoughts

Svelte is one of the most promising, productive, and frankly fun JavaScript frameworks I’ve worked with. The relative ease with which TypeScript can be added is like a cherry on top. Having TypeScript catch errors early for you can be a real productivity boost. Hopefully this post was of some help achieving that.


The post Integrating TypeScript with Svelte appeared first on CSS-Tricks.

You can support CSS-Tricks by being an MVP Supporter.

A Calendar in Three Lines of CSS

This article has no byline and is on a website that is even more weirdly specific than this one is, but I appreciate the trick here. A seven-column grid makes for a calendar layout pretty quick. You can let the days (grid items) fall onto it naturally, except kick the first day over to the correct first column with grid-column-start.

Thoughts:

  • I’d go with an <ol> rather than a <ul> just because it seems like days are definitely ordered.
  • The days as-a-list don’t really bother me since maybe that makes semantic sense to the content of the calendar (assuming it has some)
  • But… seeing the titles of the days-of-the-week as the first items in the same list feels weird. Almost like that should be a separate list or something.
  • Or maybe it should all just be a <table> since it’s sort of tabular data (it stands to reason you might want to cross-reference and look at all Thursdays or whatever).

Anyway, the placement trickery is fun.

Here’s another (similar) approach from our collection of CSS Grid starter templates.

Direct Link to ArticlePermalink


The post A Calendar in Three Lines of CSS appeared first on CSS-Tricks.

You can support CSS-Tricks by being an MVP Supporter.

VB6: how can i get rendering speed?

without use DirectX, how can i get rendering\graphics speed?
i created an Image class that uses DIB's... but something seems wrong for i draw in a pixel way.. too slow, maybe because i'm trying getting the line, 3D, points.
maybe someone can give me more info:

Friend Sub DrawImageRectanglePoints(DestinationHDC As Long, Points() As Position3D, WorldSize As Size3D, Optional ByVal Opacity As Long = 255)
    'Points(1) is the Upper-Right
    'Points(2) is the Low-Right
    'Points(3) is the Low-Left
    Dim x As Long
    Dim y As Long
    Dim PosX As Long
    Dim PosY As Long
    Dim DestinationBitmap As Long
    Dim lpBitsDestination As Long
    Dim DestuHdr          As BITMAPINFOHEADER
    Dim bm As BITMAP
    Dim bi As BITMAPINFO
    Dim desthDib As Long, destlpBits As Long
    Dim desthPrevBmp As Long
    If (hBitmap = 0 Or hMemDC = 0) Then Exit Sub
    'Get actual hBitmap from Destination HDC:
    DestinationBitmap = GetCurrentObject(DestinationHDC, OBJ_BITMAP)
    GetObject DestinationBitmap, Len(bm), bm

    'Get all pixels from that hBitmap:
    Dim ImageData() As Byte
    ReDim ImageData(0 To (bm.bmBitsPixel \ 8) - 1, 0 To bm.bmWidth - 1, 0 To bm.bmHeight - 1)

    GetBitmapBits DestinationBitmap, bm.bmWidthBytes * bm.bmHeight, ImageData(0, 0, 0)

    'Get left and right vertical line points:
    Dim PointsUpperDownLeft() As Position3D
    PointsUpperDownLeft = GetLinePoints(Points(0), Points(3))
    Dim PointsUpperDownRight() As Position3D
    PointsUpperDownRight = GetLinePoints(Points(1), Points(2))

    'Between the left and right vertical line points we get the horizontal line points:
    Dim DrawPixelPoints() As Position3D
    Dim OriginPoint As POINTAPI
    Dim Point As POINTAPI
    Dim color As COLORQUAD
    Dim OriginPosX As Long, OriginPosY As Long
    Dim OriginWidth As Long, OriginHeight As Long
    Point = ConvertPositon3DTo2D(Points(3), WorldSize)
    OriginPosX = Point.x
    Point = ConvertPositon3DTo2D(Points(0), WorldSize)
    OriginPosY = Point.y
    Point = ConvertPositon3DTo2D(Points(2), WorldSize)
    OriginWidth = Point.x
    OriginHeight = Point.y

    'Move from horizontal line dots and draw the pixel:
    For y = 0 To UBound(PointsUpperDownLeft) - 1
        'Get the horizontal line points:
        DrawPixelPoints = GetLinePoints(PointsUpperDownRight(y), PointsUpperDownLeft(y))
        'OriginPoint = ConvertPositon3DTo2D(DrawPixelPoints(0), WorldSize)
        PosY = y
        If (PosY >= (Height)) Then
            While (PosY > (Height - 1))
                PosY = PosY - Height
            Wend
        End If
        For x = 0 To UBound(DrawPixelPoints) - 1

            PosX = x


            'Test the image size for we tiled the image:
            If (PosX > (Width - 1)) Then
                While (PosX > (Width - 1))
                    PosX = PosX - Width
                Wend
            End If



            'Get the pixel color(ARGB):

        On Error Resume Next

            'Convert the 3D point to 2D point:
            Point = ConvertPositon3DTo2D(DrawPixelPoints(x), WorldSize)

            'changing the RGB pixel:

            ImageData(0, Point.x, Point.y) = Pixels(Width - PosX, PosY).B
            ImageData(1, Point.x, Point.y) = Pixels(Width - PosX, PosY).G
            ImageData(2, Point.x, Point.y) = Pixels(Width - PosX, PosY).R
            pvChangeAlphaRGBA ImageData(2, Point.x, Point.y), ImageData(1, Point.x, Point.y), ImageData(0, Point.x, Point.y), ImageData(3, Point.x, Point.y), Opacity
            'AlphaBlend DestinationHDC, Point.x, Point.y, 1, 1, hMemDC, Width - PosX, PosY, 1, 1, AC_SRC_ALPHA * &H1000000 + Opacity * &H10000

        Next x

    Next y

    'Show the new image:
    SetBitmapBits DestinationBitmap, bm.bmWidthBytes * bm.bmHeight, ImageData(0, 0, 0)
    If destHDC <> 0 Then
        Call SelectObject(destHDC, prevbit)
        Call DeleteDC(destHDC)
    End If
End Sub

that's why, on other topic, i speaked on UBound() and LBound()

5 Craft Trends to Try in 2021

Can you believe that this year is almost over? And to be honest, it couldn’t have come quicker. With the new year fast approaching, there are a ton of new craft trends to try. Since...

Visit The Site For More...

Beginner’s Guide: What is VoIP and How Does it Work? (Explained)

We are often asked by beginners: what is VoIP and how does VoIP work? If you are a non-techy user, then you may have heard that you could use VoIP to add a business phone number for your website.

VoIP is a more cost-effective way to get a business phone number for your website when compared to a traditional phone line. However before making any decision, you need to fully understand what the technology is all about.

In this beginner’s guide, we will answer what is VoIP, and how does VoIP work behind the scenes. The goal is to help you understand how VoIP can save you money and help you grow your business.

What is VoIP and How it Works (Behind the Scenes)

Here is an overview of what we’re going to cover in this guide. You can click on these links to jump straight to different sections.

What is VoIP?

VoIP (Voice Over Internet Protocol) is a phone technology that allows you to make and receive phone calls using the internet instead of traditional phone lines.

Unlike landline phone systems that are limited to a single desk phone in your office, VoIP lets you make and receive business phone calls from your laptop, tablet, regular smart phone (using an App), and even VoIP compatible office phone sets.

Since all calls are made over the internet, it’s extremely cost-efficient for both domestic and long distance (international) calls. Most business VoIP providers offer unlimited minutes without any extra cost.

Aside from the cost savings, you also get all the advanced phone features like call waiting, call routing, caller tones, auto-attendant, multiple phone numbers, and more.

This is why most small businesses and even enterprise companies are all switching away from traditional phone providers to a business VoIP provider.

At WPBeginner, we use Nextiva, a leading VoIP based business phone system.

How VoIP Actually Works? (Behind the Scenes Look)

To understand how VoIP actually works, we will take a look at what happens when you make or receive a phone call on VoIP phone.

How VoIP works Behind the Scenes

When you make a phone call using VoIP, their business phone number app or VoIP adapter takes the analog audio signal and turn it into digital signal.

This digital voice data is then sent to the business phone service provider using your internet, and then finally the message is routed to your customer’s phone.

This process happens nearly instantly which is why sometimes VoIP sound quality is even better than regular phone calls.

How is VoIP different than Traditional Phone System?

VoIP works differently behind the scenes from a regular landline phone system.

Traditional telephony systems use the circuit switching method for connecting calls. When you make a call through the Public Switched Telephone Network (PSTN), you’re connected to the person on the other end, and they’re connected to you in a circuit.

The ‘Circuit switching’ technology is used for more than a 100 years now. It is reliable and still works, but is not the most efficient or cost-effective.

VoIP uses the ‘packet switching’ method instead. This means that data is only sent when needed. A brief, instant connection is created each time you speak. The connection doesn’t need to go both ways all the time. You and the person you’re talking to will not normally be both speaking at the same time.

Plus, packets of data are sent efficiently. They can use many different paths through the internet. The packages are then put back together when they reach their destination.

The data packets can also be compressed to save space. This lets them travel even more quickly through the internet.

All of this happens very fast. Unless there’s a problem with your internet connection, you will not notice any delay during the call.

Two women talking on the phone

While VoIP may sound quite technical and complicated, the main thing to understand is that VoIP is a more efficient method of transferring data during phone calls.

You probably have already used VoIP before without knowing it, through an app like Skype or Google Voice.

VoIP Pros and Cons Compared

Since we’ve been using a VoIP business phone service in our company for years, it’s fair to say that we know a thing or two about the pros and cons.

Here’s our detailed analysis of the pros and cons of VoIP.

VoIP Advantages – Benefits of Using VoIP

Switching from a traditional telephone company’s service to a cloud based VoIP phone system has many benefits.

Lower Monthly Cost

One of the biggest advantage of VoIP is that you have lower monthly cost on both domestic and international calls.

Most VoIP phone providers will often include unlimited domestic calls for free. International calls are normally very cheap, too.

Aside from that, you’ll also save money on repair and maintenance service expenses that you currently pay your landline phone provider.

Take calls from anywhere – Completely Portable

With VoIP, you don’t need to be in an office, on-premise, sitting by your desk phone to take phone calls. You can take incoming calls from wherever you are using an app on your phone, tablet, or laptop computer.

This is a big advantage for teams that are working remotely or out on the field. It is also great if you’re traveling.

Advanced business phone features

VoIP solutions normally include lots of extra business phone features. For instance, you can set up conference calls easily with VoIP.

Plus, most VoIP service providers offer a virtual receptionist, hold music, call waiting, voicemail to email or text, and much more. You can even get advanced telecommunications functionality like video conferencing.

This may also get you additional cost savings because often traditional telephone service providers charge recurring fees for these add-ons.

Improved Scalability and Flexibility

Another advantage of VoIP is higher scalability. Whether you’re hiring more staff or opening a new branch office in a new city, VoIP makes it easy to grow.

Unlike a traditional phone service that would require to spend money on expensive hardware on dedicated line, VoIP lets you add your team members with just a few clicks inside your account dashboard.

Since VoIP works on all smart phones, you can even cut additional equipment cost and free up desk space by having your team members install the app on their personal phone.

VoIP Disadvantages – Drawbacks of Using VoIP

While VoIP is an amazing technology, it may not be perfect for everyone. There are a couple of VoIP disadvantages that you should be aware of.

You need a good internet connection to make telephone calls

As we explained in the how VoIP works section, you need to have an internet connection to make phone calls.

If your internet is slow, then your call quality may be impacted.

The good thing is that VoIP technology doesn’t use as much bandwidth as you might think. A good connection with less than 70ms ping and at least 500 kbps of upload speed is good enough for VoIP calls.

However if you have a lot of team members in your office, then you may need to look at your bandwidth needs for the number of concurrent calls your business will be making at the same time.

You need to account for power outages

Regular phone service works during power outages. But you cannot make VoIP calls if you don’t have power or access to the internet.

Typically, most offices have wireless internet powered by WiFi routers. These routers need electricity, so if your building experiences power outage, then your internet can also go down which will impact your VoIP service.

The way we mitigate this in our office is by using a battery backup system for our internet router. Since our internet is provided by a different company than our electricity, we never have both outages at the same time.

Furthermore, since our team members use the VoIP app on their phone, they can always use their mobile data to make business phone calls.

You will need to retrain your staff on the new system

Switching to a new telephone system means you need to train your staff on how to use it.

Luckily, most VoIP services are designed to be as straightforward and intuitive as possible. This means it should be easy to train team members on how to use the cloud phone systems, even if your employees are working remotely.

Which is the Best VoIP Phone Service?

Here at WPBeginner, we use and recommend Nextiva as the best VoIP phone service. They offer a free local or toll-free number with all of their plans.

Nextiva

Nextiva comes with all the essential features you need including call routing, unlimited domestic voice calls, unlimited business SMS messaging, voicemail to email/text, number porting, caller ID, caller forwarding, custom greetings, auto attendant, hold music, online VoIP fax, phone extension for team members, and more.

They have an easy to use smart phone app for Android / iPhone (iOS), and a softphone app for your computer.

For Enterprise customers, then even let you convert your existing PBX (private branch exchange) system into a cloud phone system using SIP (session initiation protocol) trunking. This means you can easily transfer calls to different department and employees using your existing system and local area network.

Nextiva also has several useful advanced features. For instance, you can connect your VoIP phone system with real-time live chat and with your CRM system to help you create a unified communications system.

Plus, their support team is extremely helpful, making it really easy for you to get started. This is why we use Nextiva for our business.

Other great VoIP alternatives to Nextiva include:

  • RingCentral – a big, well-known VoIP company that costs a little more than Nextiva. They have all the features you need, and they offer screen sharing and conferencing tools too.
  • Ooma – an easy-to-setup option that offers toll-free numbers plus all the features you’d expect. You get 500 minutes included for free, but need to pay extra for more.
  • Grasshopper – another great business phone service for solpreneurs and small businesses that offers all the essential features.
  • Phone.com – a good IP telephone for businesses working with Canada and many EU countries, as these locations are covered as local calls.

How to Make a Call Using VoIP

To make a call using VoIP, you first need a VoIP business phone service like Nextiva. You also need an internet connection with good bandwidth. This normally means using a broadband internet connection.

Then, you can make a call using VoIP with any of the following devices:

  • Your existing phone handset. This can be connected to the VoIP system using an ATA (analog telephone adapter) which gives it an IP address. Essentially, you just plug your phone into the ATA instead of straight into your wall socket.
  • A special IP phone. This looks and works like a normal phone. It has a handset with buttons that slots into a charging cradle. However, instead of the a RJ-11 phone connector, the IP phone has an RJ-45 connector. This means it plugs into an ethernet port on your router, not into a phone connector. Depending on the season, some VoIP companies may give you a free phone handset.
  • Your computer. You will need an app that lets you make calls over VoIP. This is sometimes called a ‘softphone’. Of course, you will also need a sound card plus a headset, or a microphone and speakers. You will also need internet connectivity, either by ethernet or wifi. Most well-known VoIP companies have apps for both Windows and Mac.
  • Your mobile phone. Again, you will need the right app and a wifi connection. You can also use a mobile data plan with 4G or higher speeds. Most VoIP apps will work on all smart phone such as Android mobile devices and Apple iPhone (iOS).

Frequently Asked Questions about VoIP Phone (VoIP FAQs)

There are lots of different business VoIP providers, and it can be hard to know which one is the best for your needs.

Over the years we have helped thousands of beginners choose the best VoIP phone platform. We have heard almost every possible question about VoIP that you can think of.

Following are the answers to some of the most commonly asked questions about VoIP (Voice over IP).

How much do domestic vs international calls cost on VoIP?

Most VoIP services will include unlimited domestic calls for no extra charge. However, some cheaper VoIP services charge based on the number of minutes you use.

The international rates will vary depending on the VoIP provider you use, but these rates will almost always be more affordable than traditional landline rates for international calls.

Can you keep your existing phone number on VoIP?

Yes, when switching from traditional landline phone to business VoIP phone, you can ask for number porting which lets you keep your existing business phone number.

Most good VoIP services let you do this, but please check with them before signing up.

Is there a VoIP backup if your internet connection goes down?

Some VoIP services have a backup in case your broadband connection is down or your power goes out. For instance, Nextiva can automatically forward calls to a cell phone.

Does VoIP offer call routing or extensions for team members?

Yes, most good VoIP phone service providers include call routing, phone extensions, call queue, and auto attendant at no additional cost.

We hope this article helped answer the questions of what is VoIP and how does it work behind the scenes. You might also like our comparison of the best website builder platforms, and best email marketing services to grow your business.

If you liked this article, then please subscribe to our YouTube Channel for WordPress video tutorials. You can also find us on Twitter and Facebook.

The post Beginner’s Guide: What is VoIP and How Does it Work? (Explained) appeared first on WPBeginner.

What’s Coming To VueX?

Vuex is the solution for state management in Vue applications. The next version — Vuex 4 — is making its way through the final steps before officially releasing. This release will bring full compatibility with Vue 3, but doesn’t add new features. While Vuex has always been a powerful solution, and the first choice for many developers for state management in Vue, some developers had hoped to see more workflow issues addressed. However, even as Vuex 4 is just getting out the door, Kia King Ishii (a Vue core team member) is talking about his plans for Vuex 5, and I’m so excited by what I saw that I had to share it with you all. Note that Vuex 5 plans are not finalized, so some things may change before Vuex 5 is released, but if it ends up mostly similar to what you see in this article, it should be a big improvement to the developer experience.

With the advent of Vue 3 and it’s composition API, people have been looking into hand-built simple alternatives. For example, You Might Not Need Vuex demonstrates a relatively simple, yet flexible and robust pattern for using the composition API along with provide/inject to create shared state stores. As Gábor states in his article, though, this (and other alternatives) should only be used in smaller applications because they lack all those things that aren’t directly about the code: community support, documentation, conventions, good Nuxt integrations, and developer tools.

That last one has always been one of the biggest issues for me. The Vue devtools browser extension has always been an amazing tool for debugging and developing Vue apps, and losing the Vuex inspector with “time travel” would be a pretty big loss for debugging any non-trivial applications.

Thankfully, with Vuex 5 we’ll be able to have our cake and eat it too. It will work more like these composition API alternatives but keep all the benefits of using an official state management library. Now let’s take a look at what will be changing.

Defining A Store

Before we can do anything with a Vuex store, we need to define one. In Vuex 4, a store definition will look like this:

import { createStore } from 'vuex'

export const counterStore = createStore({
  state: {
    count: 0
  },

  getters: {
    double (state) {
      return state.count * 2
    }
  },

  mutations: {
    increment (state) {
      state.count++
    }
  },

  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})

Each store has four parts: state stores the data, getters give you computed state, mutations are used to mutate the state, and actions are the methods that are called from outside the store to accomplish anything related to the store. Usually, actions don’t just commit a mutation as this example shows. Instead, they are used to do asynchronous tasks because mutations must be synchronous or they just implement more complicated or multi-step functionality. Actions also cannot mutate the state on their own; they must use a mutator. So what does Vuex 5 look like?

import { defineStore } from 'vuex'

export const counterStore = defineStore({
  name: 'counter',

  state() {
    return { count: 0 }
  },

  getters: {
    double () {
      return this.count * 2
    }
  },

  actions: {
    increment () {
      this.count++
    }
  }
})

There are a few changes to note here. First, instead of createStore, we use defineStore. This difference is negligible, but it’s there for semantic reasons, which we’ll go over later. Next, we need to provide a name for the store, which we didn’t need before. In the past, modules got their own name, but they weren’t provided by the module itself; they were just the property name they were assigned to by the parent store that added them. Now, there are no modules. Instead, each module will be a separate store and have a name. This name is used by the Vuex registry, which we’ll talk about later.

After that, we need to make state a function that returns the initial state instead of just setting it to the initial state. This is similar to the data option on components. We write getters very similar to the way we did in Vuex 4, but instead of using the state as a parameter for each getter, you can just use this to get to the state. In the same way, actions don’t need to worry about a context object being passed in: they can just use this to access everything. Finally, there are no mutations. Instead, mutations are combined with actions. Kia noted that too often, mutations just became simple setters, making them pointlessly verbose, so they removed them. He didn’t mention whether it was “ok” to mutate the state directly from outside the store, but we are definitely allowed and encouraged to mutate state directly from an action and the Flux pattern frowns on the direct mutation of state.

Note: For those who prefer the composition API over the options API for creating components, you’ll be happy to learn there is also a way to create stores in a similar fashion to using the composition API.

import { ref, computed } from 'vue'
import { defineStore } from 'vuex'

export const counterStore = defineStore('counter', {
  const count = ref(0)

  const double = computed(() => count.value * 2)

  function increment () {
    count.value++
  }

  return { count, double, increment }  
})

As shown above, the name gets passed in as the first argument for defineStore. The rest looks just like a composition function for components. This will yield exactly the same result as the previous example that used the options API.

Getting The Store Instantiated

In Vuex 4, things have changed from Vuex 3, but I’ll just look at v4 to keep things from getting out of hand. In v4, when you called createStore, you already instantiated it. You can then just use it in your app, either via app.use or directly:

import { createApp } from 'vue'
import App from './App.vue' // Your root component
import store from './store' // The store definition from earlier

const app = createApp(App)

app.use(store)
app.mount('#app')

// Now all your components can access it via `this.$store`
// Or you can use in composition components with `useStore()`

// -----------------------------------------------

// Or use directly... this is generally discouraged
import store from './store'

store.state.count // -> 0
store.commit('increment')
store.dispatch('increment')
store.getters.double // -> 4

This is one thing that Vuex 5 makes a bit more complicated than in v4. Each app now can get a separate instance of Vuex, which makes sure that each app can have separate instances of the same stores without sharing data between them. You can share an instance of Vuex if you want to share instances of stores between apps.

import { createApp } from 'vue'
import { createVuex } from 'vuex'
import App from './App.vue' // Your root component

const app = createApp(App)
const vuex = createVuex() // create instance of Vuex

app.use(vuex) // use the instance
app.mount('#app')

Now all of your components have access to the Vuex instance. Instead of giving your store(s) definition directly, you then import them into the components you want to use them in and use the Vuex instance to instantiate and register them:

import { defineComponent } from 'vue'
import store from './store'

export default defineComponent({
  name: 'App',

  computed: {
    counter () {
      return this.$vuex.store(store)
    }
  }
})

Calling $vuex.store, instantiates and registers the store in the Vuex instance. From that point on, any time you use $vuex.store on that store, it’ll give you back the already instantiated store instead of instantiating it again. You can call the store method straight on an instance of Vuex created by createVuex().

Now your store is accessible on that component via this.counter. If you’re using the composition API for your component, you can use useStore instead of this.$vuex.store:

import { defineComponent } from 'vue'
import { useStore } from 'vuex' // import useStore
import store from './store'

export default defineComponent({
  setup () {
    const counter = useStore(store)

    return { counter }
  }
})

There are pros and cons to importing the store directly into the component and instantiating it there. It allows you to code split and lazily loads the store only where it’s needed, but now it’s a direct dependency instead of being injected by a parent (not to mention you need to import it every time you want to use it). If you want to use dependency injection to provide it throughout the app, especially if you know it’ll be used at the root of the app where code splitting won’t help, then you can just use provide:

import { createApp } from 'vue'
import { createVuex } from 'vuex'
import App from './App.vue'
import store from './store'

const app = createApp(App)
const vuex = createVuex()

app.use(vuex)
app.provide('store', store) // provide the store to all components
app.mount('#app')

And you can just inject it in any component where you’re going to use it:

import { defineComponent } from 'vue'

export default defineComponent({
  name: 'App',
  inject: ['store']
})

// Or with Composition API

import { defineComponent, inject } from 'vue'

export default defineComponent({
  setup () {
    const store = inject('store')

    return { store }
  }
})

I’m not excited about this extra verbosity, but it is more explicit and more flexible, which I am a fan of. This type of code is generally written once right away at the beginning of the project and then it doesn’t bother you again, though now you’ll either need to provide each new store or import it every time you wish to use it, but importing or injecting code modules is how we generally have to work with anything else, so it’s just making Vuex work more along the lines of how people already tend to work.

Using A Store

Apart from being a fan of the flexibility and the new way of defining stores the same way as a component using the composition API, there’s one more thing that makes me more excited than everything else: how stores are used. Here’s what it looks like to use a store in Vuex 4.

store.state.count            // Access State
store.getters.double         // Access Getters
store.commit('increment')    // Mutate State
store.dispatch('increment')  // Run Actions

State, getters, mutations, and actions are all handled in different ways via different properties or methods. This has the advantage of explicitness, which I praised earlier, but this explicitness doesn’t really gain us anything. And this API only gets more difficult to use when you are using namespaced modules. By comparison, Vuex 5 looks to work exactly how you would normally hope:

store.count        // Access State
store.double       // Access Getters (transparent)
store.increment()  // Run actions
// No Mutators

Everything — the state, getters and actions — is available directly at the root of the store, making it simple to use with a lot less verbosity and practically removes all need for using mapState, mapGetters, mapActions and mapMutations for the options API or for writing extra computed statements or simple functions for composition API. This simply makes a Vuex store look and act just like a normal store that you would build yourself, but it gets all the benefits of plugins, debugging tools, official documentation, etc.

Composing Stores

The final aspect of Vuex 5 we’ll look at today is composability. Vuex 5 doesn’t have namespaced modules that are all accessible from the single store. Each of those modules would be split into a completely separate store. That’s simple enough to deal with for components: they just import whichever stores they need and fire them up and use them. But what if one store wants to interact with another store? In v4, the namespacing convolutes the whole thing, so you need to use the namespace in your commit and dispatch calls, use rootGetters and rootState and then work your way up into the namespaces you want to access getters and state from. Here’s how it works in Vuex 5:

// store/greeter.js
import { defineStore } from 'vuex'

export default defineStore({
  name: 'greeter',
  state () {
    return { greeting: 'Hello' }
  }
})

// store/counter.js
import { defineStore } from 'vuex'
import greeterStore from './greeter' // Import the store you want to interact with

export default defineStore({
  name: 'counter',

  // Then use the store
  use () {
    return { greeter: greeterStore }
  },

  state () {
    return { count: 0 }
  },

  getters: {
    greetingCount () {
      return `${this.greeter.greeting} ${this.count}' // access it from this.greeter
    }
  }
})

With v5, we import the store we wish to use, then register it with use and now it’s accessible all over the store at whatever property name you gave it. Things are even simpler if you’re using the composition API variation of the store definition:

// store/counter.js
import { ref, computed } from 'vue'
import { defineStore } from 'vuex'
import greeterStore from './greeter' // Import the store you want to interact with

export default defineStore('counter', ({use}) => { // use is passed in to function
  const greeter = use(greeterStore) // use use and now you have full access
  const count = 0

  const greetingCount = computed(() => {
    return  ${greeter.greeting} ${this.count} // access it like any other variable
  })

  return { count, greetingCount }
})

No more namespaced modules. Each store is separate and is used separately. You can use use to make a store available inside another store to compose them. In both examples, use is basically just the same mechanism as vuex.store from earlier and they ensure that we instantiating the stores with the correct instance of Vuex.

TypeScript Support

For TypeScript users, one of the greatest aspects of Vuex 5 is that the simplification made it simpler to add types to everything. The layers of abstraction that older versions of Vuex had made it nearly impossible and right now, with Vuex 4, they increased our ability to use types, but there is still too much manual work to get a decent amount of type support, whereas in v5, you can put your types inline, just as you would hope and expect.

Conclusion

Vuex 5 looks to be almost exactly what I — and likely many others — hoped it would be, and I feel it can’t come soon enough. It simplifies most of Vuex, removing some of the mental overhead involved, and only gets more complicated or verbose where it adds flexibility. Leave comments below about what you think of these changes and what changes you might make instead or in addition. Or go straight to the source and add an RFC (Request for Comments) to the list to see what the core team thinks.