Daniel Kuperman, Author at ProdSens.live https://prodsens.live/author/daniel-kuperman/ News for Project Managers - PMI Tue, 19 Mar 2024 07:20:18 +0000 en-US hourly 1 https://wordpress.org/?v=6.5.5 https://prodsens.live/wp-content/uploads/2022/09/prod.png Daniel Kuperman, Author at ProdSens.live https://prodsens.live/author/daniel-kuperman/ 32 32 Exploring 5 Docker Alternatives: Containerization Choices for 2024 https://prodsens.live/2024/03/19/exploring-5-docker-alternatives-containerization-choices-for-2024/?utm_source=rss&utm_medium=rss&utm_campaign=exploring-5-docker-alternatives-containerization-choices-for-2024 https://prodsens.live/2024/03/19/exploring-5-docker-alternatives-containerization-choices-for-2024/#respond Tue, 19 Mar 2024 07:20:18 +0000 https://prodsens.live/2024/03/19/exploring-5-docker-alternatives-containerization-choices-for-2024/ exploring-5-docker-alternatives:-containerization-choices-for-2024

In the realm of containerization, Docker has long been hailed as the go-to platform for developers. However, the…

The post Exploring 5 Docker Alternatives: Containerization Choices for 2024 appeared first on ProdSens.live.

]]>
exploring-5-docker-alternatives:-containerization-choices-for-2024

Image description

In the realm of containerization, Docker has long been hailed as the go-to platform for developers. However, the landscape has evolved, presenting a plethora of alternatives tailored to various needs and preferences. In this comprehensive round-up, we’ll delve into 5 Docker alternatives that offer diverse capabilities for building and deploying containers in 2024.

Is Docker Still the Best Choice in 2024?

While Docker remains a stalwart in the containerization domain, its supremacy is no longer unchallenged. Opting for an alternative tool can mitigate Docker’s limitations, cater to specific requirements, and foster consistency across different environments. Whether it’s circumventing the Docker daemon on host machines or ensuring uniform container technology usage from development to production, alternatives offer tailored solutions.

Dispelling the Myth: Using Containers Beyond Docker

Once synonymous with containerization, Docker’s dominance has waned with the emergence of a more diversified ecosystem. Container basics are now standardized by the Open Container Initiative (OCI), facilitating interoperability among various tools. Consequently, Docker’s exclusivity is dispelled, and alternatives can seamlessly handle existing container content, including images sourced from popular registries like Docker Hub.

Exploring the Top Docker Alternatives

Embarking on a journey to explore containerization options reveals a rich tapestry of tools, each addressing distinct use cases and functionalities. Here, we spotlight 5 noteworthy alternatives that encompass a spectrum of features and capabilities:

  1. Podman
  2. Containerd and nerdctl
  3. Rancher Desktop
  4. Buildah
  5. LXC

Podman

Image description

This open-source container engine is a lightweight and daemonless alternative to Docker. It utilizes containerd (which we’ll discuss next) under the hood, offering a familiar Docker command-line experience for managing containers. Podman is ideal for those seeking a Docker-like experience without the requirement of a background daemon.

Podman’s CLI is Docker-compatible; most commands can be converted by simply replacing docker with podman, such as podman ps and podman run instead of docker ps and docker run. Additionally, Podman has a graphical desktop application called Podman Desktop, serving as an open-source alternative to Docker Desktop. This graphical interface simplifies the management of container resources, providing an intuitive experience without the need to learn complex command line syntax

Containerd and nerdctl

Image description

This CNCF (Cloud Native Computing Foundation) project is a lightweight container runtime. Unlike Docker, it focuses solely on runtime functionalities and doesn’t handle image building or registry management. However, containerd is the runtime engine used by Docker itself, making it a powerful and secure foundation for containerization.

Nerdctl is deliberately designed to be fully Docker-compatible. Docker commands can be directly translated to their Nerdctl counterparts by simply replacing docker with nerdctl—try nerdctl build instead of docker build, for example. Docker Compose commands are supported too.

Setting up containerd and nerdctl is slightly more complex than just using Docker. However, this approach gives you more control over your container stack: you can easily replace the containerd runtime or nerdctl CLI in the future if you need to. It also allows you to access new containerd features that haven’t yet made it into Docker.

Rancher Desktop

Image description

This open-source desktop application provides a comprehensive container development environment. It bundles Docker along with Kubernetes, the renowned container orchestration platform, alongside other essential tools. This integrated approach offers a convenient one-stop solution for developers engaged in containerized application development. Rancher Desktop serves as an excellent choice for individuals seeking a user-friendly platform that streamlines the process of building and deploying containerized applications.

Buildah

Buildah is a tool specifically designed to streamline the process of building OCI-compliant container images. Unlike other container tools, it focuses solely on image creation and lacks features for running containers.

Image description

Ideal for those seeking a lightweight solution for image management, Buildah offers a daemonless architecture and a straightforward CLI. It seamlessly integrates into custom tooling environments, providing flexibility and ease of use. Additionally, Buildah enables direct interaction with OCI images, allowing for modifications such as adding supplementary content or executing additional commands.

Whether assembling images from existing Dockerfiles or through CLI commands, Buildah simplifies the image creation process. Furthermore, it offers the capability to mount filesystems generated during the build process onto the host system, facilitating convenient inspection of output image content.

LXC

Linux Containers (LXC) represents an OS-level containerization solution deeply integrated into Linux systems. Positioned between full virtualization and the lightweight application containers provided by OCI tools like Docker, LXC offers a unique approach to containerization.

Image description

LXC containers are characterized as system containers, encompassing a complete operating system within. This architecture allows for the installation of diverse software workloads within the container environment. Once created, LXC containers persist on the host system for the duration of their necessity. The management experience resembles that of traditional virtual machines, offering robust control and persistence.

In contrast, application or process containerization tools like Docker prioritize executing a single process within an ephemeral environment. These containers are typically short-lived, serving a specific task before terminating. While suitable for many modern development and cloud deployment scenarios, this model can prove restrictive for more intricate software requirements.

Choosing LXC over Docker may be preferable in situations demanding the execution of multiple workloads within containers, necessitating deeper access to the container’s operating system, or favoring VM-like administration techniques. Notably, LXC does not directly support OCI containers. However, it is feasible to create an LXC container from an OCI image utilizing specialized templates.

The post Exploring 5 Docker Alternatives: Containerization Choices for 2024 appeared first on ProdSens.live.

]]>
https://prodsens.live/2024/03/19/exploring-5-docker-alternatives-containerization-choices-for-2024/feed/ 0
The manager’s toolkit: Setting up your team for success in product marketing https://prodsens.live/2023/10/20/setting-up-your-team-for-success-in-product-marketing/?utm_source=rss&utm_medium=rss&utm_campaign=setting-up-your-team-for-success-in-product-marketing https://prodsens.live/2023/10/20/setting-up-your-team-for-success-in-product-marketing/#respond Fri, 20 Oct 2023 16:24:59 +0000 https://prodsens.live/2023/10/20/setting-up-your-team-for-success-in-product-marketing/ the-manager’s-toolkit:-setting-up-your-team-for-success-in-product-marketing

This article is based on Daniel’s brilliant talk at the Product Marketing Misunderstood event. PMA members can enjoy…

The post The manager’s toolkit: Setting up your team for success in product marketing appeared first on ProdSens.live.

]]>
the-manager’s-toolkit:-setting-up-your-team-for-success-in-product-marketing

The manager's toolkit: Setting up your team for success in product marketing

This article is based on Daniel’s brilliant talk at the Product Marketing Misunderstood event. PMA members can enjoy the session in its full glory here.  


Hi there! My name’s Daniel Kuperman, and I work in product marketing for Atlassian. Here, I’m going to share what I wish I’d known when I first became a people manager.

When I first got promoted to a management position, I was simply given four people and told to run with it. I’d had my share of bad managers, and I knew the obvious things not to do. I’d also had some good managers who I wanted to emulate. But what I didn’t have was guidance on how not only to manage the work my team would do, but how to manage the people doing it. 

If you’re a new manager, you’ve probably wondered things like: How do I start? What do I do first? How can I avoid stress for my team and myself? That’s what I’m going to help you with today.

The post The manager’s toolkit: Setting up your team for success in product marketing appeared first on ProdSens.live.

]]>
https://prodsens.live/2023/10/20/setting-up-your-team-for-success-in-product-marketing/feed/ 0
20 Tools & Resources for Conducting Market Research https://prodsens.live/2023/09/15/20-tools-resources-for-conducting-market-research/?utm_source=rss&utm_medium=rss&utm_campaign=20-tools-resources-for-conducting-market-research https://prodsens.live/2023/09/15/20-tools-resources-for-conducting-market-research/#respond Fri, 15 Sep 2023 11:24:16 +0000 https://prodsens.live/2023/09/15/20-tools-resources-for-conducting-market-research/ 20-tools-&-resources-for-conducting-market-research

Finding out if a product will be successful beyond the initial curiosity is just good business. With market…

The post 20 Tools & Resources for Conducting Market Research appeared first on ProdSens.live.

]]>
20-tools-&-resources-for-conducting-market-research

Finding out if a product will be successful beyond the initial curiosity is just good business. With market research, you determine whether the opportunity exists, how to position the product or service, or what consumers’ opinions are after the launch.

→ Download Now: Market Research Templates [Free Kit]

If you’re sensitive to the high costs of failure and need to gather facts and opinions to predict whether your new product, feature, or location will be successful, start by investing in market research using these tools and resources.

Here are 21 of the best tools for conducting market research, including a few recommendations directly from HubSpot market researchers. Let’s dive in.

Market Research Kit (with 5 templates)

Download the Kit Now

Helpful Market Research Tools & Resources

1. Glimpse

Market Research tool: Glimpse

For Max Iskiev, Market Research Analyst at HubSpot, one research tool stands out from the rest, and that’s Glimpse.

He told me, “Glimpse is my favorite research tool. It’s quick and easy to use, allowing me to design and launch short surveys for real-time insights on trending topics.”

As a writer for the HubSpot Marketing Blog, I’ve also used Glimpse to run short, 100-person surveys for articles (case in point: Are Sales Reps Rushing Back to the Office?).

Not only is Glimpse valuable for doing quick pulse-checks on the latest trends, but it also leverages the power of AI for even deeper insights.

“Glimpse really shines when it comes to open-ended questions, using natural language processing and AI to analyze emotion and sentiment, saving time and offering invaluable insights,” Iskiev shared.

Pricing: $1,000/month (Pro Account)

2. Statista

Statista data visualization platform and market research tool

Statista is a data visualization website that takes data from reputable reports across the web and makes them easy and digestible for researchers, marketers, and product creators just like you.

“Statista is like my market research sidekick, giving me all the data I need without the endless search. No more digging through the haystack, with Statista I can spot trends and make informed decisions with ease,” Icee Griffin, Market Researcher at HubSpot, told me.

Are you planning on launching a new video game and want to know how many hours people spend playing video games? There’s a chart for that.

One neat aspect of using Statista is that the same chart is updated as the years pass. Say that you want to allude to the value of the beauty market in your proposal. If your investor accesses that same graph a year from now, it will reflect updated numbers, as Statista always finds the most recent research to update their visualizations. (Note that Statista doesn’t carry out original research.)

Pricing: Free; $39/month (billed yearly); $1,950 (one-time 30-day access)

3. Think With Google Research Tools

Think with Google market research tools

Wish you had information on your product’s likelihood of success? Think With Google’s marketing research tools offer interesting insights on whether anyone is looking for your product (Google Trends), which markets to launch to (Market Finder), and what retail categories rise as the months and seasons pass (Rising Retail Categories).

If you’d like to market your product through YouTube, the Find My Audience tool allows you to investigate what your potential viewers are interested in and what you should discuss in your brand’s YouTube channel.

Pricing: Free

4. Census Bureau

Census Bureau market research tool

The Census Bureau offers a free resource for searching U.S. census data. You can filter by age, income, year, and location. You can also use some of its shortcuts to access visualizations of the data, allowing you to see potential target markets across the country.

One of the best ways to use this tool is by finding the NAICS code for your business, then accessing the Tables tool, then clicking Filter on the sidebar and searching for your industry. Easily find out where your target industry is most popular — or where the market has been oversaturated. Another helpful tool is the Census Bureau Business and Economy data, where you can also target premade tables depending on your industry.

Pricing: Free

5. Make My Persona

Make My Persona target buyer creator and market research tool

HubSpot’s Make My Persona tool allows you to create a buyer persona for your potential new product. In this tool, you pick a name for the persona, choose their age, identify their career characteristics, and identify their challenges, allowing you to pinpoint both demographic and psychographic information.

This tool is most suited for B2B product launches because you’ll be prompted to document your buyer persona’s career objectives and role-specific challenges. As such, your product would ideally solve a problem for them in the workplace or help their company achieve revenue goals.

Pricing: Free

6. Tableau

Tableau analytics platform and market research tool

Tableau is a business intelligence suite of products that allows you to “connect to virtually any data source.” But the data isn’t presented in unreadable tables. Rather, Tableau helps you visualize this data in a way that helps you glean insights, appeal to external stakeholders, and communicate the feasibility of your product to potential investors.

You can visualize data on anything from corn production in tropical climate zones to office product sales in North America. With Tableau’s tools, you can take as granular or as general a look you’d like into potential marketplaces and supplier regions. Tableau also integrates well with spreadsheets and databases so that you can export Tableau data to Excel, back up records in Amazon Redshift, and more.

Pricing: $12/user/month (Tableau Viewer); $35/user/month (Tableau Explorer); $70/user/month (Tableau Creator)

7. Paperform

paperform homepage-1

A market research survey is an effective way to understand your target audience and their needs better by asking them directly. Since this step is integral to understanding your dream customer’s problems, you want to ensure the process is as interactive as possible and incites an objective and accurate response.  

With its free-text interface, Paperform is as simple as writing a word document. Make your survey stand out by customizing colors, fonts, layouts and themes, and create your unique look and feel. f you’re unsure where to start, you can use one of their expertly made questionnaires or market research survey templates to get you started. 

With Paperform, you can add conditional logic to show or hide questions or whole sections of content. Create fully personalized paths for different personas to create more interactive forms that lower drop-off rates and boost customer interaction. Or use any of the 27+ question fields, like the ranking, matrix, or scale fields, to create visually engaging ways to collect information.

Pricing: Free (14-day trial); Essentials ($20/month); Pro ($40/month); and Agency ($135/month)

8. Claritas MyBestSegment

Claritas MyBestSegment market research tool for finding target audiences

Claritas MyBestSegment provides product researchers with tools to understand an area’s demographic information and the area’s inhabitants’ lifestyle habits. By finding out what a segment of the population does — without having to go out and survey them — you can find out which areas would be most receptive to a campaign or launch, which competitors are located nearby, and which lifestyle trends have shifted or are on the rise.

A snapshot of an audience segment gives you basic information on their household income, lifestyle traits, employment levels, and education levels. If you want more specific data relating to these topics, you’ll have to contact Claritas’ sales team to become a customer.

Pricing: Free; Pricing available on request

9. SurveyMonkey

SurveyMonkey market research tool for surveying panelists

SurveyMonkey is a powerful tool for creating in-depth market research surveys that will help you understand your market and consumer preferences.

With this tool, you can create targeted, uber-specific surveys that help you collect answers that pertain specifically to your product. While using a data source can give you a general overview of your target audience and market, SurveyMonkey can help you get more granular insights from real consumers.

SurveyMonkey offers dedicated market research solutions and services, including a global survey panel, a survey translation service for international research, and a reporting dashboard option that allows you to easily parse through the results.

Pricing: Free, $32/month (Advantage Annual), $99/month (Premier Annual), $99/month (Standard Monthly); $25/user/month (Team Advantage, minimum 3 users), $75/user/month (Team Premier, minimum 3 users), Enterprise (Contact for pricing)

10. Typeform

Typeform surveying platform and market research tool

Like SurveyMonkey, Typeform allows you to run research surveys to get direct answers from your target consumers. It’s an easy-to-use, mobile-optimized form-builder that’s great for market research.

Typeform’s distinguishing factor is that it shows viewers one form field at a time. In its templates, it encourages a more conversational, casual approach (like in its market research survey template). This makes it a better fit for product launches that target a younger demographic. If you’re targeting C-suite executives at established firms, consider a more formal option such as SurveyMonkey or keeping your tone more formal in your questions.

You can create a wide range of question types, including multiple choice questions, short-form questions, and rating scale questions. Other features include the ability to recall answers from previous questions and create logic jumps.

In a survey, you’d want to collect both demographic and psychographic information on your customer, seeking to understand their purchasing behaviors and the problems they encounter. The goal is to find out if your product is the solution to one of those problems — and whether, before launching, you should add more features or rethink your product positioning strategy.

Pricing: Free; $35/month (Essentials); $50/month (Professional); $70/month (Premium)

11. Upwave Instant Insights

Upwave Instant Insights tool for market and consumer research

Upwave Instant Insights is a consumer research tool that’s part of the Upwave brand marketing platform. While it isn’t advertised as a survey creation tool, it allows you to launch market research surveys specifically to get consumer insights.

Instant Insights allows you to target audiences on Upwave’s partner ecosystem and visualize the data for easy scanning by key stakeholders and investors. One pro of using this platform is that Upwave distributes your survey to real people — not just people taking surveys for the money, which could skew the results.

To create a survey, you sign up on the Upwave platform, click your name in the upper right-hand corner, and click “My Surveys,” where you can create as many surveys as you want. For the Basic option, you have a 6-question limit, while the Advanced option allows you to include unlimited questions.

Pricing: $2/study participant (Basic); $3/study participant (Extended); $4/study participant (Advanced)

12. Loop11

Loop11 usability testing platform for market research

Loop11 is a user experience testing platform that allows you to test the usability of your website, study user intent, test the information architecture of your site, and examine how the user experience changes based on the device they’re using.

This tool is useful for market research because you can find out whether your target consumers find your site easy to navigate. You can also identify snags that prevent conversions.

Loop11 tests your site by making users perform tasks. They then complete a short question about how easy or difficult the task was to complete. Your product may be phenomenal, but unless consumers can buy it through your site, you won’t launch it successfully.

You can use Loop11’s participants or bring in your own.

Pricing: $63/month (Rapid Insights), $239/month (Pro), $399/month (Enterprise)

13. Userlytics

Userlytics usability testing platform for market research

Like Loop11, Userlytics allows you to test the usability of your website, mobile app, and site prototype. You can target different devices, define a buyer persona, and disqualify participants based on screening questions.

Testing is based on tasks that your test-takers carry out. They then answer a simple question about the difficulty of the task. You can structure the question in various ways; you can leave it open-ended, provide multiple choices, or ask for a rating. Other formats you can use include System Usability Scale (SUS) questions, Net Promoter Score (NPS) questions, and Single Ease Questions (SEQ).

Userlytics performs both a webcam and a screen recording. You can compare the user’s answers with their reactions on video to understand how they feel when they’re interacting with your assets.

Pricing: $49/participant (Quick & Easy); $69/participant (Annual Enterprise); Custom pricing available on request

14. Temper

Temper quick survey tool for market research

Sometimes you need a no-frills test to take the pulse of consumers. Temper allows you to create a question, grab a snippet of code, and pop it onto your website. The smiley face, “meh” face, and frown face make it easy for viewers to make a snap judgment.

One great way to use this tool is by adding the widget on a blog post announcing the launch of your new product. That way, you can find out general sentiment on the product before launching it. You can also add it to a product page, an email, or a landing page.

When you include the widget, you can change the question to something that’s tailored to your offerings.

Pricing: $12/month (Hobby), $49/month (Pro), $89/month (Business), $199/month (White Label)

15. NielsenIQ

NielsenIQ market research consultant for enterprise firms

NielsenIQ is a retail and consumer intelligence consultant that works with you to collect consumer insights, identify the best distribution channels for your product, and create a range of products that addresses the needs of your target buyers.

This service helps you look at your product launch from all angles and delivers forecasting data that predicts how your sales will perform upon launch. NielsenIQ can also run consumer insights surveys on their list of panelists and partners.

Because it operates like a consultant and not as a self-service software, NielsenIQ is a better option for established firms with a bigger product launch budget.

Pricing: Pricing available on request

16. Ubersuggest

Ubersuggest keyword research tool for market research

Ubersuggest is a simple tool for doing keyword and content research. You can input a phrase, and it’ll create a list of keyword suggestions. You can also see top performing articles and pages so that you get an initial understanding of the type of content that ranks for the keywords.

This tool is useful for market research because you can see who your top competitors are, how often your product is searched for, and whether there’s enough space in the market for the type of product you’re launching. You can also find out the questions your target audience asks in relation to the product. Each of these questions can be turned into a blog post that can inform your audience, increasing your brand authority and driving conversions.

Alternatives to Ubersuggest include Moz, Ahrefs, and SEMRush.

Pricing: Free; $29/month (Individual); $49/month (Business); $99/month (Enterprise / Agency)

17. Pew Research Center

Pew Research Center data sets for market research

From economic conditions, to political attitudes, to social media usage, the Pew Research Center website has a ton of free research that you can use to better understand your target market. Best of all, the site has interactive articles that allow you to filter and sift through the data for more granular, targeted insights.

Topics include U.S. politics, digital media, social trends, religion, science, and technology.

Pricing: Free

18. BrandMentions

BrandMentions social monitoring platform for market research

BrandMentions is a social media monitoring platform that can help you understand what your prospective customers are buzzing about online. Search for a keyword, and BrandMentions will show you recent social posts that contain that keyword, along with the context of its usage. After subscribing to the platform, you can also get sentiment analysis on the keyword.

You’ll also get other metrics such as Reach (how many people view the keyword per day), Performance (how many people engage with the keyword per day), and Mentions by Weekday (when people are mentioning the keyword).

You can use this tool for market research by finding out when people are looking for your product on social media sites. When you start announcing the new product, you can use insights from this tool to post about the launch at exactly the right time. It also allows you to find out how people are generally feeling about the type of product you’re launching. That way, you can better refine the tone of your campaigns.

Pricing: $99/month (Growing Business); $ 299/month (Company); $ 499/month (Enterprise/Agency)

19. Qualtrics Market Research Panels

Qualtrics market research panels for consumer insights

Qualtrics takes the pain of finding respondents for your market research surveys through an online sample service. After identifying your target audience, you can go to Qualtrics for access to a representative sample. You can either use your chosen survey software or use Qualtrics’ built-in platform for insights and feedback.

Pricing: Pricing available on request

20. Qualaroo

qualaroo-1

Qualaroo is an advanced user and market research tool that helps you understand your target market with targeted surveys. You can run surveys on over six channels at once (such as website, app, product, social media, and mail,) to get a 360-degree view of your existing and potential customers.

It comes packed with features like question branching, 12+ answer types, automatic survey language translation, in-depth audience targeting, pre-built survey templates, and an extensive repository of professionally designed questions.

You can create various market research surveys in minutes to collect data on the demographic, psychographic, and behavioral traits of your target audience. It can help you map customers’ expectations and preferences, create customer personas, and perform audience segmentation.

Qualaroo also promotes quick feedback analysis. Its in-built AI-based sentiment analysis and text analytics engine automatically categorizes the responses based on user moods. It also highlights the key phrases and words in real-time, saving hours of manual work.

Pricing: $80/month billed annually (Essentials); $160/month billed annually (Premium)

Conduct Market Research for a Successful Product Launch

Conducting market research is essential to successfully launch a product to market. With the tools we’ve shared, you can find out who’s looking for your product, why they need it, and how you can better market it upon launch, ensuring that it’s a success.

Editor’s note: This post was originally published in April 2016 and has been updated for comprehensiveness.

New Call-to-action

 

The post 20 Tools & Resources for Conducting Market Research appeared first on ProdSens.live.

]]>
https://prodsens.live/2023/09/15/20-tools-resources-for-conducting-market-research/feed/ 0
How to Write a Cover Letter for an Internship [Examples & Template] https://prodsens.live/2023/09/15/how-to-write-a-cover-letter-for-an-internship-examples-template/?utm_source=rss&utm_medium=rss&utm_campaign=how-to-write-a-cover-letter-for-an-internship-examples-template https://prodsens.live/2023/09/15/how-to-write-a-cover-letter-for-an-internship-examples-template/#respond Fri, 15 Sep 2023 11:24:15 +0000 https://prodsens.live/2023/09/15/how-to-write-a-cover-letter-for-an-internship-examples-template/ how-to-write-a-cover-letter-for-an-internship-[examples-&-template]

Writing a cover letter can feel like a daunting task, especially if you don’t have a lot of…

The post How to Write a Cover Letter for an Internship [Examples & Template] appeared first on ProdSens.live.

]]>
how-to-write-a-cover-letter-for-an-internship-[examples-&-template]

Writing a cover letter can feel like a daunting task, especially if you don’t have a lot of real-world experience.

Fortunately, a cover letter is actually a chance to explain how your extracurriculars and classes have taught you exceptional leadership and time management skills.

→ Click here to access 5 free cover letter templates [Free Download]

We’ve created an internship cover letter template to provide some initial structure and inspiration. For the best results, download our template, then add your own creativity and flair with the tips below.

There are different formats you can use when writing internship cover letters, but you can’t go wrong with the traditional business letter format. Business professionals use this template style to apply for full-time roles, so your cover letter will stand out above the rest. Remember to proofread, use formal terms such as “Dear” and “Sincerely,” and lean towards a professional tone in your body copy.

1. Include your name, date, location, and contact information.

Although some companies are firmly against using applicant tracking systems, chances are many of the companies you apply to will screen your resume and cover letter using one. That means you’ll need to stand out to both an automated system and human recruiters.

Have you ever heard the myth that you’d get credit for writing your name on the SAT exam? The same applies to adding contact information to your cover letter, but it’s 100% true. Make it easy for the recruiter to get in touch with you by providing an up-to-date phone number and email address.

In the past, it was common for job and internship seekers to include their exact address on their cover letter as they’d mail them directly to the hiring managers. In today’s digital world, most hiring teams won’t need to know your exact home address to extend an internship offer, so feel free to leave it off. Simply include your city and state to give the team an idea of your proximity to the office.

Your Name

Your Address

Your City, State, Zip Code

Cell: 555-555-5555

Email: name@email.com

Date

2. Include the company, department, and company address.

If you’re writing a cover letter for several internship opportunities, you’ll find it helpful to search the full name, department, and headquarters address of each company. Doing this as a separate step will help you copy the information accurately in your cover letter. Remember, you don’t want any typos or mistakes in your cover letter, especially when it comes to information that can be easily found on the internet.

Finding the department name may not be as simple, so you can leave that out if you’re unsure. If your company has several campuses or operates in different cities, use the address of the location where the internship will be performed or the office location where your hiring manager works. If your internship will be remote, use the company’s general headquarters address.

Department

Company

Street

City, State Zip

3. Address the hiring manager.

As a student looking for an internship, you’ll definitely set yourself apart from other applicants by being resourceful. You can show your resourcefulness by searching for the hiring manager’s name to properly address them in your cover letter. Occasionally, their title is stated in the role description. You can then search for the role on LinkedIn to identify their name. If you can’t find a name, you can instead address them by title only. Other times, though, finding the name of the hiring manager could be more difficult. If a Google search doesn’t return a first and last name, your best bet is to leave the name out. Sacrificing a bit of personalization is much better than addressing the wrong person in your cover letter.

Dear X, (try to find the hiring manager’s name… if you can’t, you can put “Dear [Company A] Hiring Committee”)

4. Set the context for your application.

In the first paragraph, explain how you heard about the company or position, and if you know anyone at the company, mention them here. Next, express your own interest in the company or position and explain briefly how it relates to your own passions. Don’t forget to introduce yourself in this paragraph, writing your name, your education level, your major, and your interests.

You may opt for a creative first line to capture the reader’s attention. One that worked for me early in my career went something like this:

Can I tell you a secret? I’ve been telling stories since I was five years old. No, not fibbing — real storytelling…

This is where you’ll benefit from researching the company’s culture. While this opening statement worked well for startups and more laid-back companies, a big accounting firm might find it culturally off-beat.

5. Sell your experience.

Scan the internship position description and pick out a few qualities you think apply to you — just don’t choose all the descriptors mentioned as it could appear disingenuous and make your cover letter too long. For instance, if I see a company is looking for someone who’s “outgoing, organized, hardworking, and willing to take criticism,” I would pick those that describe me best and focus on providing examples in the body of my cover letter.

Mentioning the traits directly in your cover letter shows you’ve read the position description, and makes your cover letter more scannable. If the hiring manager is looking for someone with content skills, she might scan your cover letter looking for the words that indicate experience with content.

Finally, brainstorm a few compelling examples to show how you embody the most important characteristics. Don’t just write, “I have excellent customer service skills.” You want to prove it. Support your claim by writing something like,

Last summer, I worked as an orientation leader at my college, serving as a resource for incoming students and their parents. This experience strengthened my customer service skills.

Even if you don’t have a lot of (or any) job experience, think about highlighting skills you’ve gained from extracurriculars, volunteer experience, or even passion projects:

“My passion for dance led me to become a volunteer dance teacher which helped me develop as a leader.”

6. Close the letter with grace and a call to action.

If the internship application does not explicitly state “please do not contact,” you might choose to conclude by specifying how you will follow up, such as, “I will call next week to see if my qualifications are a match,” or, “I am eager to meet with you to discuss this opportunity, and am available for an interview at a mutually convenient time.” Conclude by thanking the hiring manager for taking the time to consider you, and end on a positive, confident note, such as, “I look forward to speaking with you soon.”

You may even go a step further and give the hiring manager a call to action. Include a link to your online portfolio, a website, or even a YouTube channel where you display your work and personality. To see how often hiring managers are viewing these additional items, include tracking to your link using a URL tracker like Bitly to capture that data.

Sample Internship Cover Letter

Event Planning Internship Cover Letter

Your Name

1 Hireme Road

Boston, MA, 20813

Cell: 555-555-5555

Email: yourname@hireme.com

May 20, 2021

 

Event Planning Department — Internship Program

Company A

35 Recruiting St.

Boston, MA, 29174

 

Dear Internship Coordinator,

At the suggestion of John Smith, a senior marketer at Company A, I am submitting my resume for the Event Coordinator internship position. I am a junior at Elon University, pursuing a bachelor’s degree in Sport and Event Management, and am passionate about event planning. I am thrilled to hear about Company A’s Event Coordinator internship program and feel my experiences and skills would be an excellent match for your organization.

As an executive member of the Student Union Board at Elon, I am in charge of organizing, promoting, and implementing multiple school-related social activities per week, while being challenged to design new events. I work cohesively with a diverse team made up of students and faculty, and I also foster relationships with novelty companies.

My experience as an Orientation Leader has further prepared me for this internship. It was essential that I remain positive, outgoing, and energized during move-in day and act as a liaison between new students, families, and faculty in a fast-paced and demanding environment. I was expected to maintain a highly professional customer service ethic while interacting with families and new students.

My Elon University experiences, executive board membership, and orientation leadership role have prepared me to be successful in the Event Coordinator internship program. Thank you for your time and consideration. I look forward to the opportunity to discuss how I can add value to Company A.

Sincerely,

(handwritten signature)

Your Name

Marketing Internship Cover Letter Template

Your Name

1 Hireme Road

Boston, MA, 20813

Cell: 555-555-5555

Email: yourname@hireme.com

May 20, 2021

 

Marketing Department — Internship Program

Company A

35 Recruiting St.

Boston, MA, 29174

 

Dear Internship Coordinator,

I am a passionate, creative, and driven Elon University student with leadership and event planning experience, as well as strong communication skills. I am seeking opportunities to showcase my writing abilities in a challenging and stimulating environment. My skills and experiences will enable me to deliver successful results as a digital marketing intern for Company B.

Please allow me to highlight my key skills:

  • Prior experience writing blog posts and press releases for marketing objectives
  • Strong communication skills and ability to adopt voice for diverse audiences and varying purposes
  • Efficient in managing multiple projects with fast-moving deadlines through organization and time-management skills
  • A firm understanding of grammar rules and how to write effectively
  • Experience in leadership positions, both as Student Union Board executive leader and as an Elon Orientation Leader
  • Proven ability to form positive relationships with people from around the globe, exhibited by my internship experience in China last summer
  • Experience organizing, promoting, and implementing social events
  • Proficient in Microsoft Office, Adobe Creative Suite (InDesign, Photoshop, and Premiere), and social media platforms

In closing, I look forward to the opportunity to discuss how I can be an asset to Company B. I will call next week to see if you agree that my qualifications are a match for the position. Thank you for your time and consideration.

Sincerely,

(handwritten signature)

Your Name

Internship Cover Letter Examples

1. Hospitality Internship Cover Letter

Internship Cover Letter Examples: Hospitality Internship Cover Letter

Why this cover letter example works:

Passion, a willingness to learn, and previous industry experience are the factors that make this cover letter stand out. The hiring manager is able to see that the candidate has a genuine interest in the field of hospitality and takes their future in the field seriously.

How to incorporate these tips:

Start by analyzing your own experience and interest in comparison to the internship you’re applying for. Do you have any examples, facts, or figures that you can include in your letter? This will help the hiring manager understand your interest in the position and give them more of a reason to hire you over the competition.

2. Supply Chain Internship Cover Letter

Internship Cover Letter Examples: Hospitality Internship Cover Letter

Why this cover letter example works:

This student has concrete experience in three specific areas of the supply chain: demand forecasting, inventory management, and logistics strategies. Naming these areas of expertise is not only helpful for landing the internship, it helps the hiring manager structure the team by pairing them with other interns and mentors who can complement that skillset. If there’s anything a hiring manager loves more than a prepared hire, it’s a hire who’s proactive!

How to incorporate these tips:

Start by analyzing your own experience and interest in comparison to the internship you’re applying for. Do you have any examples, facts, or figures that you can include in your letter? This will help the hiring manager understand your interest in the position and give them more of a reason to hire you over the competition.

3. Fashion Design Internship Cover Letter

Internship Cover Letter Examples: Fashion Design Internship Cover Letter

Why this cover letter example works:

Hands-on experience isn’t possible in every field of work, but when you aspire to work in the fashion industry, there’s no better way to stand out for an internship. In this internship cover letter example, Peter shares that he has practical experience designing clothing which demonstrates his ability to illustrate, design, and produce a material product which is exactly what Sleeves & Thread is looking for. 

How to incorporate these tips:

Roll up your sleeves and get your hands dirty. If you’re planning to work in an industry that produces material goods, technology, or even provides services, a great way to prove your chops is to do it before you get the job. This might look like starting a small summer side hustle, working pro bono, or taking on projects at school for extra credit. Whatever route you choose, make sure to take on projects that build a quality portfolio that hiring managers will want to see.

4. Finance Internship Cover Letter

Internship Cover Letter Examples: Finance Internship Cover Letter

Why this cover letter example works:

Rebecca takes the time to highlight her skillset, but she also balances her cover letter with reasons why Banking Corporation will be a great fit for her budding career. She gives plenty of reasons why the company is appealing to her which helps balance the cover letter.

How to incorporate these tips:

The obvious point of a cover letter is to sell your skills to the hiring manager in order to secure the internship. However, it’s important to remember that the hiring process is a two-way street. It’s beneficial to incorporate reasons why you want to work for the business. Explaining what the business is doing that aligns with your personal goals and values can be the factor that tips the scale in your favor and gets you hired.

5. Marketing Cover Letter Internship Example

Internship Cover Letter Examples: Marketing Internship Cover Letter

Why this cover letter example works:

If you work in the industry of the arts, creative, or marketing, chances are you’ll have more freedom when it comes to drafting your cover letter. Here, Robin takes a novel approach by weaving colorful language that practically jumps off the page. With just enough pizazz, her personality shines through which could leave the hiring manager wanting to learn more.

How to incorporate these tips:

It may be tempting to throw in flowery language for the sake of standing out, but proceed with caution. A better approach would be to imagine you’re seeing the internship opportunity for the first time, then share your excitement with a friend. Next, write down what you said, exactly as you said it, and edit from there to include the key points of a cover letter we mention in this article. You’ll sound natural while still getting your point across succinctly.

Internship Cover Letter Templates

Standard Internship Cover Letter Template

Use this cover letter template as a foundation for your cover letter. You can customize it to fit your experience and the companies you’ll be applying to.

standard internship cover letter template

Download this cover letter template

Data-Driven Internship Cover Letter Template

If your major is data-driven like STEM, marketing, or accounting, this is the internship cover letter template for you. With this template, you can include the data highlights of your class projects and assignments to show the hiring manager that you can support your experience with credible facts.

data-driven internship cover letter template

Download this cover letter template

Entry-level Cover Letter Template

As you approach your senior year of college, you may be looking for entry-level roles rather than internships. Cover letters are just as important for full-time roles as they are for internships, so use this template to make the transition in your job search.

Entry-level cover letter template

Download this cover letter template

Wrapping Up Your Letter of Recommendation

A resume isn’t always enough to make an impression. Including a cover letter in your internship application is the first step to setting yourself apart from other applicants. Study and apply the six steps for writing a professional internship cover letter and use one of these samples or templates to customize it. Your resume gives the highlights of your time in college while your cover letter tells the story of how those experiences will serve you as an intern with your future employer. Use it to your advantage to land the first role in your career as you navigate college and beyond.

Editor’s note: This post was originally published in April 2018 and has been updated for comprehensiveness.

This article was written by a human, but our team uses AI in our editorial process. Check out our full disclosure to learn more about how we use AI.

Professional Cover Letter Templates

 

The post How to Write a Cover Letter for an Internship [Examples & Template] appeared first on ProdSens.live.

]]>
https://prodsens.live/2023/09/15/how-to-write-a-cover-letter-for-an-internship-examples-template/feed/ 0
Storing image from React formData to Cloudinary using Node/Express API https://prodsens.live/2023/08/13/storing-image-from-react-formdata-to-cloudinary-using-node-express-api/?utm_source=rss&utm_medium=rss&utm_campaign=storing-image-from-react-formdata-to-cloudinary-using-node-express-api https://prodsens.live/2023/08/13/storing-image-from-react-formdata-to-cloudinary-using-node-express-api/#respond Sun, 13 Aug 2023 05:24:36 +0000 https://prodsens.live/2023/08/13/storing-image-from-react-formdata-to-cloudinary-using-node-express-api/ storing-image-from-react-formdata-to-cloudinary-using-node/express-api

I won’t waste your time. Chances are if you’ve ended up here you’ve run into the same issue…

The post Storing image from React formData to Cloudinary using Node/Express API appeared first on ProdSens.live.

]]>
storing-image-from-react-formdata-to-cloudinary-using-node/express-api

I won’t waste your time. Chances are if you’ve ended up here you’ve run into the same issue that plagued me for 3 months or you’re reading this because I mentioned it in my Twitter.

Prerequisites:

  1. You’re making a fullstack app using MERN (and using MVC)
  2. You’re trying to send form data that includes image file data in your POST request
  3. Something is wrong with the incoming request, particularly the image data (parsing the path)

I’m going to assume you have everything else working and you understand your folder structure. I used Axios to send my requests from my React frontend to my backend. You don’t need to.

Backend:

  1. Install Cloudinary and Multer dependencies (if you haven’t already)

  2. Grab your Cloundiary CLOUD_NAME, API_KEY and API_SECRET from your Cloudinary dashboard.

    Navigating to your Cloudinary dashboard:

    navigation on cloudinary to dashboard

    cloudname key, api key and api secret key on cloudinary dashboard

  3. Grab these 3 values and save them in your .env.

    cloudname, api key, and secret key saved to variabled in .env file

  4. Set up your Cloudinary middleware file. I named mine cloudinary.js. Here you’ll use your keys for the configuration. Make sure you’re using the right file path for your project to access those keys in your .env file.

    Ex:

    const cloudinary = require("cloudinary").v2;
    
    require("dotenv").config({ path: "./config/.env" });
    
    cloudinary.config({
      cloud_name: process.env.CLOUD_NAME,
      api_key: process.env.API_KEY,
      api_secret: process.env.API_SECRET,
    });
    
    module.exports = cloudinary;
    
  5. Set up your Multer middleware file. Mine is named multer.js and it’s in the same ‘middleware’ file as my cloudinary.js. I used the following configuration:

    const multer = require("multer");
    const path = require("path");
    
    module.exports = multer({
      storage: multer.diskStorage({}),
      fileFilter: (req, file, cb) => {
        let ext = path.extname(file.originalname);
        if (ext !== ".jpg" && ext !== ".jpeg" && ext !== 
    ".png" && ext !== ".PNG") {
          req.fileValidationError = "Forbidden extension";
          return cb(null, false, req.fileValidationError);
          // cb(new Error("File type is not supported"), false);
          // return;
        }
        cb(null, true);
      },
    });
    
  6. Set up your POST route for creating a new post/item/whatever, to grab the image file.
    *** I used the MVC file structure so my routes are in their own ‘routes’ folder. All my routes for posts are in a file called ‘posts.js’.

    You’ll add upload.single() after the URL in your POST route. Note that I have multer listening for my image data that will come through under the name “file”. You can name yours whatever you want but it needs to match what you named that input in your form in the frontend.

    const express = require("express");
    const router = express.Router();
    const postsController =  require("../controllers/posts")
    const upload = require("../middleware/multer")
    
    router.post("https://dev.to/addPost", upload.single("file"), postsController.addPost)
    
    module.exports = router;
    

    For reference, here’s what my input looks like in my React frontend. I’ve set the name to “file”, as well.

    Image description

  7. Set up your controller function for adding the new item. I have my controller functions in a post.js file in a controller folder.

    I used destructuring to grab my values. You don’t have to do this. You can just use req.body.myProperty, for example.

    NOTE: All values that are NOT the file data are preceded with req.body. To grab the file path you can destructure the way I did or you use req.file.path.

    const Post = require("../models/Post");
    const mongoose = require("mongoose");
    const cloudinary = require("../middleware/cloudinary");
    
    module.exports = {
        addPost: async (req, res) => {
    const { prompt, media, size, canvas, description } = 
    req.body
    
           const { path } = req.file;
        },
    }
    
  8. Right under that, I ran my body of code through a try/catch block. Since you’ll need the unique image URL and the CloudinaryID to save to your db, you’ll want to do that first and wait for it to return a result.

    try{
        const result = await cloudinary.uploader.upload(path);
    }catch(err){
        res.status(400).json({err: err.message})
        console.error(err)
    }
    
  9. After awaiting the result from cloudinary, we’ll want to create our new post. I have a property in my schema for file, which holds the result.secure_url (this is the unique URL for my image), and cloudinaryId, holding result.public_id — the id for that image now stored in my media library in cloudinary. I need the id in order to delete later on.

    let newPost = await Post.create({
               prompt: prompt,
               media: media,
               size: size,
               canvas: canvas,
               file: result.secure_url,//don't forget to append secure_url to the result from cloudinary
               cloudinaryId: result.public_id,//append publit_id to this one you need it to delete later
               description: description,
               user: req.user.id,
    });
    

    The whole code block for my addPost function looks like this:

    addPost: async (req, res) => {
         const { prompt, media, size, canvas, description } = req.body
    
            const { path } = req.file;
    
            try{
                const result = await cloudinary.uploader.upload(path);
    
                let newPost = await Post.create({
                    prompt: prompt,
                    media: media,
                    size: size,
                    canvas: canvas,
                    file: result.secure_url,//don't forget to append secure_url to the result from cloudinary
                    cloudinaryId: result.public_id,//append publit_id to this one you need it to delete later
                    description: description,
                    user: req.user.id,
                });
                res.status(200).json(newPost)
            }catch(err){
                res.status(400).json({err: err.message})
                console.error(err)
         }
     },
    

    Okay, hopefully, that’s working for you. I’m sorry if you get red text in the console screaming at you.

Frontend:

  1. Install Axios (if you want) and import it.

    import axios from "axios";
    
  2. Make sure you have your form coded out. Here’s a simplified example of what I had in my AddPostForm React component:
    (I left out the arrays I was mapping through to populate my selection elements)

    const AddPostForm = () => {
    return(
      
    ) } export default AddPostForm
  3. Import useRef from ‘react’, call it at the top of your component to declare a ref, and add it to your form element.

    If you don’t know much about the useRef hook and/or have never used it before you can read more about it here. I got this tip from a senior dev who took a look at my code with me. He suggested I use useRef to grab my form data.

    import { useRef } from 'react';
    const AddPostForm = () => {
    const formRef = useRef();
    
        return( 
             
    ....
    ) } export default AddPostForm
  4. Declare and define your handleSubmit function.
    Create a new FormData object and pass in the ref we declared earlier, appending the current property.

    const handleSubmit = async (e) => {
        e.preventDefault()
        const formData = new FormData(formRef.current)
    }
    
  5. Send and await the result of the POST request. I set mine within a try/catch block. I honestly don’t know if it’s necessary but I’m so used to doing it now.

  • The first argument in axios’ post() is the URL of your POST route. Make sure yours matches whatever you’ve set it as.

  • The second argument is the data you want to send off. In this case, the formData we grabbed earlier.

NOTE: With Axios you don’t have to append .json() to parse the response as JSON because Axios does that for you.

NOTE2: After getting the response I reset the form data with: formRef.current.reset();

```
const handleSubmit = async (e) => {
 e.preventDefault()
 const formData = new FormData(formRef.current)

 try {
    const res = await axios.post('/post/addPost', formData)
    console.log(res.data)
    formRef.current.reset();
}catch (err){
    console.log(err.response.data.err)
   }
}
```

I hope to God this worked for you. Aside from Axios I was also using React’s state container library, Redux. Redux holds the state, in this case, my posts, and makes them available globally after wrapping my App.js in a context. It’s not necessary to send the form data but it makes it so I don’t have to manually refresh the page to see updates to my DB.

I was thinking about posting more about how I solve issues but dealing with markdown text editors is more of a pain than it’s worth and I swear I spent more time editing this to get it formatted just the way I wanted it than I did actually figuring out my steps and writing them out.

The post Storing image from React formData to Cloudinary using Node/Express API appeared first on ProdSens.live.

]]>
https://prodsens.live/2023/08/13/storing-image-from-react-formdata-to-cloudinary-using-node-express-api/feed/ 0
How to Write a Great Email Signature [+ Professional Examples] https://prodsens.live/2023/08/07/how-to-write-a-great-email-signature-professional-examples/?utm_source=rss&utm_medium=rss&utm_campaign=how-to-write-a-great-email-signature-professional-examples https://prodsens.live/2023/08/07/how-to-write-a-great-email-signature-professional-examples/#respond Mon, 07 Aug 2023 22:24:15 +0000 https://prodsens.live/2023/08/07/how-to-write-a-great-email-signature-professional-examples/ how-to-write-a-great-email-signature-[+-professional-examples]

Around the globe, more than 300 emails are sent and received each day, on average. That’s 300 opportunities…

The post How to Write a Great Email Signature [+ Professional Examples] appeared first on ProdSens.live.

]]>
how-to-write-a-great-email-signature-[+-professional-examples]

Around the globe, more than 300 emails are sent and received each day, on average. That’s 300 opportunities to market yourself and your business in those individual emails you send.

A lot of people treat their email signatures like an afterthought, which is a big missed opportunity. Those signatures are a chance for you to make it clear who you are, make it easy for people to reach you, and give people a place to go to find out more — either about you, about your business, or about something you’re working on.

Create a new, on-brand email signature in just a few clicks. Get started here.  (It's free.)

So, if you’re just putting your name and a point or two of contact information in your signature, you’re not taking full advantage of the opportunity to connect and engage with the people you’re emailing. So what exactly should go in your signature?

1. First and Last Name

Just like with snail mail correspondence, your name should always be included so that the recipient of your message knows who it was from. This manifests in the email signature, often as the first line of text.

2. Affiliation Info (Such as Job Title and Department)

Closely following your name should be your affiliation information. Your affiliations could include your job title, your company or organization, and/or even your department. Your name should eventually be its own draw, of course, as you build a relationship with the recipient, but providing this information provides more context about the conversation and your role in it.

In addition, affiliating yourself with a larger organization lends you more credibility, especially if it’s a recognizable organization. This helps you get the attention of your readers so they take your message seriously.

3. Secondary Contact Information

Secondary contact information is important, too, so that the recipient knows how else to contact you. Secondary information might include phone, fax, or any other method of communication you want to emphasize. In situations where you don’t want to cough up your direct line, you could take this opportunity to promote your personal website — a passive way to open the lines of communication without flooding yourself with outreach if you don’t want it.

4. Social Profile Icons

Your social media presence is a major part of your personal brand because it helps you gain a following in your space and shows people what you care about. You can tell a lot about a person by what they post and how they portray themselves.

That’s why it’s a great idea to include links to your social media pages in your email signature. It not only reinforces your personal brand, but it also helps people find new ways to contact and follow you.

Even better? It can help drive traffic to your online content if you’re posting links to that content on social media. So if you do include social icons in your signature, make sure you’re keeping your social profiles up-to-date and chock full of interesting, relevant content. (In other words, if you haven’t tweeted in six months, you may want to leave Twitter out.)

Why use social media icons instead of simply text links? Because icons are more easily recognizable for folks skimming your signature — and they’ll stand out from the rest of the text in there. According to research from NeoMam Studios, visuals shown in color increase a person’s willingness to read the rest of the content by 80%. That’s a huge advantage. Plus, icons are big space-savers in a place where you might be packing a lot of information.

Even if you have a presence on a lot of social media sites, though, try to cap the number of icons to five or six. Focus on the accounts that matter most to growing your business or building your personal brand.

If you do include a lot of social media icons, at least try to cut back on the other content if possible so your design isn’t too busy. Check out the example below, made using HubSpot’s Email Signature Generator.

What to include in an email signature: social profile icons

5. Call to Action

One of the smartest things you can do in your email signature is include a call-to-action. The best email signature CTAs are simple, up-to-date, non-pushy, and in line with your email style, making them appear more like post-script, and less like a sales pitch.

Choose a CTA that aligns with one of your current business goals, and update it when those goals change. Here’s an example of a HubSpotter’s email signature that includes a CTA for the HubSpot Podcast Network:

HubSpot Podcast Network CTA in a Professional Email Signature

If you find yourself emailing back and forth with colleagues and clients who want to book meetings with you, make it easy for them by including a link to book your calendar right in your email signature. Here’s an example from our own Bryan Lowry, below.

There are many tools out there that’ll help people book appointments. If you’re a HubSpot Sales customer, you can share your personalized meeting link with anyone who you want to book a meeting with and let them choose from your available times. If you want, you can make it so the HubSpot CRM automatically creates a new contact record for anyone who books a meeting if one doesn’t already exist.

professional email signature example: vertical layout by hubspot

If you aren’t a HubSpot customer, one great meeting tool is Calendly, which is free for Basic and lets you integrate your Google or Office 365 calendar. If you’re looking for a Calendly alternative, YouCanBook.me is another booking tool that goes for $7 per calendar per month.

Some industries such as legal, financial, and insurance have specific guidelines on email usage and etiquette to protect private information from being transmitted. For this reason, you may want to look into what regulations your industry has in place and include a disclaimer in your signature about email transmissions. Mail-Signatures offers a number of email disclaimer examples, including this one:

“The content of this email is confidential and intended for the recipient specified in the message only. It is strictly forbidden to share any part of this message with any third party, without a written consent of the sender. If you received this message by mistake, please reply to this message and follow with its deletion, so that we can ensure such a mistake does not occur in the future.”

An image is a great choice to spice up your email signature. If you want a personal touch so that recipients you’ve never met can associate your name with your face, consider using a professional photo in your signature. Alternatively, you can use the company’s logo to add more brand awareness to the email.

9. Pronouns

While not as common in email signatures and certainly not required, adding your preferred pronouns to your signature is helpful, especially when emailing individuals you’ve never met. It also takes ambiguity away if you have a name perceived as gender-neutral.

Now that you know the elements you should include, what does a great email signature look like? Here are some tips for creating signatures that are helpful and professional, including a few great examples.

1. Emphasize your name, affiliation, and secondary contact information.

As you might guess, your name comes first. Closely following your name, however, should be your affiliation and where else people can reach you.

Your affiliation could mean your job title, your company, your school, or a similar organization that you deem important to your recipients. Your name should eventually be its own draw, of course, but using a more popular brand name — and even its logo — ensures you get the attention of your readers and they take your message seriously.

Secondary contact information is important, too. You might not want to endorse your personal phone number, but you could take this opportunity to promote your personal website — a passive way to open the lines of communication without flooding yourself with outreach you don’t want.

Here’s a sample email signature that hits on all three things described above nicely. Kevin’s first and last name are accompanied by his affiliation with the University of Connecticut. He also promotes his personal website so his recipients have another outlet to see his work and contact him for more information.

Want to create a signature like the one below? Use HubSpot’s Email Signature Generator.

email signature for Kevin McLievie of University of Connecticut generated with HubSpot's Email Signature Generator

2. Keep the colors simple and consistent.

Branding is most effective when it’s consistent — and that includes your email signature. Adding color to your email signature is a nice touch that’ll help it stand out from the rest of your email. But if you do choose to use color, be sure to stick to one or two in addition to dark text.

Use subtle highlights to match your logo or branding, like Brittany Hodak does in her email signature, below. Notice how her social media icons are the same blue hue as the ZinePak logo.

Professional email signature example by Brittany Hodak with multiple colors

3. Use design hierarchy.

Good design is all about presenting your information in an easily digestible manner. Because your email signature is likely more a list of information than it is a compelling story, you’ll want to use hierarchy to direct readers’ eyes to what they should be reading first.

Scale your name up to a larger font so that it attracts the most attention, like you would on a resume. Then, pick and choose information to bold and color based on importance so you can help guide people’s eyes logically through the design.

So you put a few links in your email signature, including your CTA and your social media icons. But is anyone actually clicking on them?

To figure out whether the links in your signature are actually attracting clicks and making an impact, you’ll want to make those links trackable — just like you would any other link in your emails.

Follow these instructions to easily make a tracking link that helps you attribute traffic to your website to your email signature. From time to time, you might switch up the format of your signature or the wording inside your signature to see what drives the most clicks.

5. Use space dividers.

Although you never want to jam-pack your email signature for too much information, there are ways to fit a lot of text into a compact area like this one without compromising design.

This is helpful for breaking up different types of information, like your name and contact information, your logo, any calls-to-action you have, or even a disclaimer.

Using space dividers within your design, as in the example below, is one great way to do this. You can also use glyph dividers, which is the vertical bar symbol (i.e., |.)

email signature for Evelyn Castiger with a space divider between photo on the left and text on the right

Image Source

6. Include an international prefix in your contact number.

If you work with people around the world, don’t forget the prefix for your country’s code when you list your contact phone number. Many people overlook this if they aren’t used to dialing international prefixes themselves, but it’s really helpful for your international colleagues and clients to have it right there. Here’s a list of country codes if you don’t know yours.

Here’s an example from Kit Smith, formerly of Brandwatch, a company that has offices in both the United States and Europe and works with international clients. Including the U.S. country code makes it easier for folks in other countries to reach him by phone.

email signature for kit smith with international country code

7. Make your design mobile-friendly.

According to Truelist, over a third of professionals open emails on their phone making it a prime method of communication for business and professional matters.

The more people who read email on mobile devices, the more you’ll want to keep mobile users top-of-mind when you’re writing emails — including your email signature.

One major way to make your email signature mobile-friendly is to make your signature’s design easy to read and clickable for mobile users. This is where scale becomes really important. Make sure your text is large enough to read on small mobile screens, and that your links and buttons are large enough — and spaced out enough — for folks to tap on with their fingers.

Check out the example below, and note how much space there is between different clickable elements like the social media icons. These are great for tapping with your finger on a mobile screen so that users don’t accidentally tap on the Facebook icon when they meant to go to Twitter.

email signature for tyler adams with padded space between social icons

Image Source

8. Use an email signature generator.

If you’ve tried all of these steps and you’re still not happy with how your email signature turned out, don’t fret. These digital sign-offs can be tricky to get perfect. Try a free email signature generator to do the heavy lifting for you instead.

Rather than choosing the colors, fonts, and layout yourself, this generator gives you several combinations to choose from. Simply add your information, photos, and links. Then choose your colors. Once you’re satisfied with your email signature, you can add it to your email account right away.

9. Check your new email signature for quality.

Finally, as with any part of an email, make sure your signature looks as good as you think it does by testing it with various email clients. Microsoft Outlook doesn’t recognize background images, for example, so avoid using those. Other email clients don’t load images by default at all.

Professional Email Signature Examples

Now that you know how to create an email signature, it’s time to get some inspiration. Here are some of our favorite examples.

1. Vertical Email Signature Example


professional email signature example: vertical layout by hubspot
Create an email signature just like this one with HubSpot’s free signature generator!

If you’d like your email signature to be low-effort and high impact while drawing attention to a call-to-action, look no further than this email signature example. Set in a vertical layout, it not only includes social links for the owner, but it uses space effectively to pull the viewer’s eye to the CTA button at the bottom.

Because of its narrow width, this email signature is ideal if many of your recipients will be opening their email on a mobile device (which is more than guaranteed, since most of us check our email on our phones). The best part? You can create your own signature using this exact same layout using our free email signature generator.

2. Beige Professional Email Signature Example

professional email signature example: beige image

Image Source

This beautiful email signature example is image-based, and while we don’t recommend using image files for your signature, it still deserves a spot on this list. Available as an image template on Canva, this example drew our eye due to its lovely layout, fonts, and colors.

The primary benefit of using an image as an email signature is that the fonts don’t change, allowing you to create a stronger branding story. Remember: The font is determined by the recipient’s email client, not by you. If you’re at all worried about that, consider using an image like this one. At the bottom, or in the alt text, you might include your contact information in plain text.

3. Shorthand Email Signature Example

professional email signatures: shorthand casual example

Image Source

This simple email signature example, created by the team over at mysignature.io, uses shorthand to identify each piece of the sender’s contact information. The owner’s email and mobile phone are designated with the letters e and m, respectively.

This trendy move can differentiate your email signature from the rest; we recommend it if you’re specifically in a more informal or casual industry. The only thing we might advise against is using such a light font and icon color, which might be more difficult for colorblind viewers to read.

4. Professor Email Signature Example

professional email signature example: professor signature

Image Source

We love this modern, eye-catching email signature example for a professor, which features a CTA, a line of social media buttons, and a paragraph of boilerplate GDPR language — which is critical in industries where you may require recipients’ private data.

In doing research for this post, we found countless email signature examples for professors and workers in academia. This one, by far, wins the prize in terms of design, professionality, and utility.

5. Instagram Influencer Email Signature Example

professional email signature example for influencer

Image Source

Whether you’re an influencer on Instagram, YouTube, or TikTok, it’s essential to still have a professional email signature — especially if you often seek corporate partnerships and deals. This email signature example provides the person’s name, title, and contact information, as well as a clever prompt for the recipient to download her media kit.

Even more importantly, it includes a button at the bottom to “Like her on Instagram” — which is essential for professionals whose main key performance indicators are engagement metrics.

6. Simple Email Signature Example


professional email signature example: simple layout by hubspotCreate an email signature just like this one with HubSpot’s free signature generator!

When in doubt, keep it simple. This email signature sample, available as a template in our free signature generator, includes all essential pieces of information with plenty of space in between. Your signature doesn’t have to be crowded and packed into just a few lines. It’s the last opportunity you have to make an impact, so it stands to reason that you can take your time.

At the bottom, the signature includes your social links for those who’d like to learn more about you or your company. And if you edit it using HubSpot’s free email signature generator, you’ll find that you can add a photo of yourself, a CTA button, and more.

7. Formal Academia Email Signature Example

professional email signature example: university and academia

Image Source

If ever in need of a formal email signature, look to this example for inspiration. Created by the University of Illinois as guidance to its employees, this email signature example is effective, simple, and frills-free.

For a more “fun” academic email signature, look to the other example from a professor in this list. But if you work in a traditional industry, this is a great example to follow. We like that it includes a privacy disclosure at the bottom, which is especially important to include if you ever plan to share your emails with anyone.

8. Real Estate Email Signature Example

professional email signatures: real estate agent

Image Source

This real estate email signature example made us wish we worked in real estate. But you can always adjust it to your needs using mysignature.io’s tool. The profile photo includes a cool modern shading effect, and the social buttons at the bottom are more prominent, making this a fantastic fit if you’d like to draw more attention to your social accounts.

The one piece we’d reconsider with this example, if you’re going to use it as inspiration, is that the CTA is too close to the other two social buttons. If you’d like your call-to-action to have the entirety of your recipient’s attention, consider using small social buttons instead.

9. School Teacher Professional Email Signature Example

professional email signature example: teacher

Image Source

With or without the image, this email signature example is a winner. It uses both bold and regular text to create a sense of structure, and includes boilerplate language about the confidentiality of the email. We like that the language at the bottom is in a lighter font, keeping the attention off of it.

This example is great to follow if you don’t need to have a CTA in your email signature. Most professionals who aren’t in sales don’t need one — though it’s always good to leave your recipient with an action they need to take.

10. Horizontal Email Signature Example


professional email signature example: horizontal layout by hubspotCreate an email signature just like this one with HubSpot’s free signature generator!

Take this spacious email signature example as inspiration if you’d like to include plenty of information — while also keeping the attention on your CTA all the way to the right. Available as a template on HubSpot’s email signature generator, this example also has space at the left for you to include social links.

We like it for its simplicity and customizability. And if you’d prefer to control the visuals of the signature down to the font, you can always screenshot it and use it as an image — just remember to include alt text.

Customize this email signature — or create your own — for free.

Best Professional Email Signature

The best professional email signature will be true to who you are both in and outside the workplace. Once you include the basic contact information, the rest of your email signature is a blank canvas for you to share a bit of personality with each professional email you send.

Armed with these email signature best practices, you can create your own signature that aligns with your brand and gives your emails a little extra umph.

Editor’s note: This post was originally published in June 2019 and has been updated for comprehensiveness.

New Call-to-action

 

The post How to Write a Great Email Signature [+ Professional Examples] appeared first on ProdSens.live.

]]>
https://prodsens.live/2023/08/07/how-to-write-a-great-email-signature-professional-examples/feed/ 0
Explicit Design, Part 4. Ports, Adapters, and Infrastructure https://prodsens.live/2023/08/07/explicit-design-part-4-ports-adapters-and-infrastructure/?utm_source=rss&utm_medium=rss&utm_campaign=explicit-design-part-4-ports-adapters-and-infrastructure https://prodsens.live/2023/08/07/explicit-design-part-4-ports-adapters-and-infrastructure/#respond Mon, 07 Aug 2023 10:25:50 +0000 https://prodsens.live/2023/08/07/explicit-design-part-4-ports-adapters-and-infrastructure/ explicit-design,-part-4.-ports,-adapters,-and-infrastructure

Let’s continue the series of posts and experiments about explicit software design. Last time we created UI components…

The post Explicit Design, Part 4. Ports, Adapters, and Infrastructure appeared first on ProdSens.live.

]]>
explicit-design,-part-4.-ports,-adapters,-and-infrastructure

Let’s continue the series of posts and experiments about explicit software design.

Last time we created UI components and discussed the interaction between the UI and the application core. In this post, we will prepare the project infrastructure: create a store for the data model and a service for API requests.

But first, disclaimer

This is not a recommendation on how to write or not write code. I am not aiming to “show the correct way of coding” because everything depends on the specific project and its goals.

My goal in this series is to try to apply the principles from various books in a (fairly over-engineered) frontend application to understand where the scope of their applicability ends, how useful they are, and whether they pay off. You can read more about my motivation in the introduction.

Take the code examples in this series sceptically, not as a direct development guide, but as a source of ideas that may be useful to you.

By the way, all the source code for this series is available on GitHub. Give these repo a star if you like the series!

Output Ports

If previously the UI was communicating with the application through input ports, then with the infrastructure, the application will communicate through output ports: the types FetchRates, ReadConverter, and SaveConverter.

Output ports are the “levers” on the “other side” of the application core. They describe what “service” functionality the application core needs to solve a particular task.

The core relies on these types and “orchestrates” the work of use cases, initiating the work of necessary services at the right moments.

Since the application core relies on abstract types, it becomes decoupled and independent of the infrastructure. Such deliberately explicit separation of code is often excessive and not needed, but we are trying to follow the principles and guidelines from programming books, so we will leave everything completely decoupled.

API Service

The first service that we will need is a module for communicating with the API server. We could describe the function for making requests to the server like this:

// services/network

export async function get<T>(url: Url): Promise<T> {
    const absolute = new URL(url, config.base);
    const response = await fetch(absolute);
    if (!response.ok) throw new Error('Failed to perform the request.');

    return await response.json();
}

The get function constructs the URL of the API endpoint, runs the browser’s fetch function under the hood, and parses the data from the server’s JSON response.

Note that the code of this function is generic. It does not know what data will come from the server, except that it will be JSON.

The distinctive feature of services is that they are conceptually not related to the domain and can work with any application. A function like get can move from project to project, residing in some lib or shared folder.

Services typically solve a specific utility task: network communication, internationalization, reading and writing to local storage, etc. In the case of the get function, we can check this by describing its type:

type ApiRequest<R> = (url: Url) => Promise<R>;

The ApiRequest type does not touch high-level application concepts. It expresses itself in low-level terms: “request,” “API,” “URL.” It doesn’t even know what kind of data it will get from the API, instead it uses the R type-argument, which says that specific data for this function is not important. What matters is the scheme of operation and communication with the server.

Because of their “genericness”, services can be reused in different projects:

Services are not directly tied to a specific application, they can be reused in different projects with the help of adapters

Obviously, such a reusable service will not work exactly as our application core wants it to. To resolve this conflict, we will write an adapter—a function that will transform this service’s interface to the type of the application’s output port.

Service Adapter

We can divide all the work of the adapter for the API service into 3 stages:

  • Getting data from the API: calling the external get service;
  • Converting the data to the format of the domain model: deserializing the API response;
  • Passing the formatted data to the application core: implementing the FetchRates output port.

Let’s assume that we know that the server sends us data in the following format:

{
    "rates": {
        "RPC": {
            "IMC": 0.98,
            "WPU": 1.23,
            "DRG": 2.2,
            "ZKL": 1.07
        },
        "IMC": { "//": "..." },
        "WPU": { "//": "..." },
        "DRG": { "//": "..." },
        "ZKL": { "//": "..." }
    }
}

Then the work of an adapter can be expressed as a sequence of the following transformations:

RefreshRates:
  API -> ServerRates
  ServerRates -> ExchangeRates
  ExchangeRates -> Application Core

Let’s write a function fetchRates that will implement the FetchRates type:

// infrastructure/api

export const fetchRates: FetchRates = async () => {
    // TODO:
    // 1. Call the API service.
    // 2. Convert the data format.
    // 3. Return the data.
};

…And now let’s implement each step.

Data Serialization

Let’s start with something simple: since we know in what format the server returns the response, we can write a function to transform the data format.

// infrastructure/api.serialization

type ServerRates = { rates: Record<BaseCurrencyCode, ExchangeRates> };
const toDomain = (dto: ServerRates): ExchangeRates => dto.rates.RPC;

In this function, we access the value of the required field in the server response and return it. In real projects, deserialization can be much more complicated depending on the server response and model data format. (We may need to rename fields or, for example, enrich them with data from another request.)

The purpose of the toDomain function is to encapsulate the knowledge of how to convert server data into a model. When such a deserializer is explicitly separated in the code, it is easier for us to find the place where we need to make changes if the shape of the data on the server changes.

Moreover, with the explicitly defined deserialization, we can support multiple API response schemas simultaneously:

// infrastructure/api.v1.serialization.ts
type ServerRates = { rates: Record<BaseCurrencyCode, ExchangeRates> };
const toDomain = (dto: ServerRates): ExchangeRates => dto.rates.RPC;

// infrastructure/api.v2.serialization.ts
type ServerRates = { default: [BaseCurrencyCode, ExchangeRates] };
const toDomain = (dto: ServerRates): ExchangeRates =>
    dto.default.find(([key]) => key === 'RPC').at(1);

Again, whether to make deserialization explicit or not depends on the task, project size, and how volatile the data on the server is. If the server response never changes, it’s probably not necessary.

The response from the server that we describe as the ServerRates type is a so-called data transfer object, DTO. We will not delve into this concept in detail, but Scott Wlaschin has a dedicated chapter on deserialization and working with DTOs in the book “Domain Modeling Made Functional.” I highly recommend reading it.

Using the deserializer, we can fill in the 2nd step of the fetchRates function:

// infrastructure/api

import { toDomain } from './api.serialization';

const fetchRates: FetchRates = async () => {
    // TODO:
    // 1. Call the API service.

    // 2. Convert the data format.
    const data = toDomain(response);

    // 3. Return the data.
    return data;
};

Request to Service

Next, we will call the service itself and retrieve the data from the API:

// infrastructure/api

import type { FetchRates } from '../../core/ports.output';
import type { ServerRates } from './api.serialization';
import { toDomain } from './api.serialization';

import { get } from '~/services/network';

const fetchRates: FetchRates = async () => {
    // 1. Get the data from the API:
    const response = await get<ServerRates>('/rates');

    const data = toDomain(response);
    return data;
};

Notice that we keep the endpoint URL directly in this module, and not in the network service. The reason for this is that the service should remain reusable and independent of the domain and specific project.

The specific endpoint URL is part of a particular feature of the current project. Knowledge of where to retrieve data for the converter from should be kept nearby to the converter itself so that we can quickly locate the necessary places for updates. This increases the cohesion of the feature, as it does not scatter knowledge of it across different parts of the application.

Such a “knowledge packaging” is also known as a vertical slice. We will discuss this architectural pattern in one of the upcoming posts 🙃

Overall, this implementation is already sufficient to integrate the API call with the core of the application. Accessing this adapter will make it call the service, transform the data into the required format, and return it.

Testing, Mocks, and Dependencies

To test such an adapter, we need to create a mock for the ~/services/network module and verify that the get function is called with the required parameters.

// infrastructure/api.test

const spy = vi.fn(() => serverStub);
vi.mock('~/services/network', () => ({ get: spy }));

// ...

it('triggers API call', async () => {
    await fetchRates();
    expect(spy).toHaveBeenCalledOnce();
    expect(spy).toHaveBeenCalledWith('/rates');
});

Using mocks to replace dependencies is a valid option in JS and TS code. In real tests of functions that work with side effects, we will most likely see mocks. However, if our goal is to make the function dependencies explicit, we can “bake” them in.

Partial Application and Explicit Dependencies

Again, the code we will be writing from now on is somewhat non-standard™. We will write it this way to demonstrate the idea of loose coupling and explicit dependencies. It’s probably not a good idea to write production code in exactly the same way unless you have good reasons to do so.

We will discuss when it’s justified to write code this way and when it’s not. For now, please keep in mind that we are writing demonstration code from which you can draw ideas for contemplation, but not necessarily do everything exactly the same way.

In the world of OOP, the idea of “substituting” the necessary dependencies at the right moment is the basis of dependency injection. In general terms, the idea is to free a module from the need to import specific dependencies and work with the reliance on their guarantees—public interfaces.

This way, modules become decoupled from each other, and “glued” together via a DI container. The DI container automatically injects the required concrete dependencies into the places where their interfaces are declared. In object-oriented code, this helps solve the problem of composing objects and their related side effects.

Dependency injection is actually a special case of inversion of control, which helps to make the code more flexible. I wrote a separate article about the idea of inversion of control, dependency injection, and how to do it in an object-oriented style.

Unlike in OOP, in more functional code, all dependencies are passed explicitly, so we won’t be using a DI container. Instead, we’ll use partial application and the Factory pattern to “bake in” the dependencies.

It doesn’t mean, however, that a DI container can’t be used together with a near-functional approach. This is more of a matter of taste and tooling but, for simplicity, we’ll go with the “raw” approach without additional tools.

Also note that in pure functional code, the concept of “dependencies” cannot exist in the first place, because any dependency brings with it a side effect, and functional code should be pure. All side effects (and therefore dependencies) in such code will be located at the edges of the application.

We do not follow this approach only for the sake of convenience and easier understanding. If you are interested in how to compose a React application in a purely functional style, let me know!

In one of our previous posts, we used the fact that inside a function, we can refer to its arguments and use them, relying on their types:

// core/changeQuoteCode

// Declare types of all required dependencies:
type Dependencies = { saveConverter: SaveConverter };

// Get access to them from the `deps` argument:
export const changeQuoteCode = (quoteCode, deps: Dependencies) => {
    // Use them inside the function
    // knowing that they implement specific types:
    saveConverter({ quoteCode });
};

Dependencies were passed as the last argument in this variant:

const result = changeQuoteCode(realArgument, dependencies);

However, such a “dependency injection” approach raises a contradiction: we either need to always require the argument with dependencies to be passed, or make it optional. Neither option is convenient or sufficiently reliable.

This contradiction can be resolved by making the function “remember” the references to its dependencies:

const result = changeQuoteCode(realArgument); // + Remembered Dependencies

In fact, we can “put” the dependencies in a closure of an outer function:

const createChangeQuoteCode = (dependencies) => {
    // Return another function that has access to `dependencies`
    // because it's in the parent scope which is visible to it.
    return (realArgument) => {
        // Do the stuff with `realArgument` AND `dependencies`.
    };
};

And then partially apply the function createChangeQuoteCode to get a function with “remembered” dependencies:

// Returns a function with “remembered” dependencies:
const changeQuoteCode = createChangeQuoteCode(dependencies);

// Return the result of calling that function:
const result = changeQuoteCode(realArgument);

The technique is called partial application because we execute a function of the form a -> b -> result “halfway,” as if stopping along the way and getting b -> result as a result. A little more about this is written on learnyouhaskell and on Scott Wlaschin’s website.

This technique of working with dependencies is sometimes called “baking” dependencies. It is exactly what we’ll use to prepare the adapter for the API.

“Baking” Adapter

To “bake” the dependencies, we will create a factory function that takes the adapter dependencies and returns FetchRates:

import type { FetchRates } from '../../core/ports.output';
import type { ServerRates } from './api.serialization';

type Dependencies = { request: ApiRequest<ServerRates> };
type CreateFetchRates = (dependencies: Dependencies) => FetchRates;

In the code, we can express this as:

// infrastructure/api

import { toDomain } from './api.serialization';

// Implement the factory that takes dependencies as argument
// and returns a prepared adapter function:

const createFetchRates: CreateFetchRates =
    ({ request }) =>
    async () => {
        const response = await request('/rates');
        const data = toDomain(response);
        return data;
    };

Then, to create and configure an adapter, we will call the factory and pass an object with the actual service to it:

// infrastructure/api.composition

import type { FetchRates } from '../../core/ports.output';
import { get } from '~/services/network';

export const fetchRates: FetchRates = createFetchRates({ request: get });

Note that the function returned by createFetchRates depends only on the types of services. We perform the substitution of specific service implementations separately, during composition. The intention (functionality of the function) and the implementation (composition) are separated again, making modules more independent.

Functionality and Composition

Let’s take a closer look at the structure and composition of the module. We can notice that the implementation of the factory and its result—the function that implements the input port—depends only on two things:

  • the internals of this same module;
  • the types of everything else.
// infrastructure/api

// When using something outside the module,
// we import only types:
import type { ApiRequest } from '~/shared/kernel';
import type { FetchRates } from '../../core/ports.output';

// Inside the module we can import anything:
import type { RatesDTO } from './api.serialization';
import { toDomain } from './api.serialization';

export const createFetchRates =
    ({ request }: Dependencies): FetchRates =>
    async () => {
        // ...
    };

This “isolation” from other modules through abstraction helps to avoid unnecessary coupling. The module has one clear entry point for other modules—the public interface:

Communication and interaction through public interfaces reduce coupling between modules because their internal details become unimportant during application composition

This entry point reduces coupling and stops the spread of changes across the codebase, because other modules no longer need to know the internals of this module, and vice versa.

On the other hand, substituting concrete implementations increases coupling, and this happens at the final stage, during the composition of the module:

// infrastructure/api.composition

import { createFetchRates } from './api';
import { get as request } from '~/services/network';

export const fetchRates: FetchRates = createFetchRates({ request: get });

Finally, to hide what should not be exposed, we can configure re-exports through index.ts:

// api/index

export * from './api.composition';

Then, from all the module internal details:

infrastructure/api/
  - api.ts                — implementation and factory;
  - api.serialization.ts  — data serialization;
  - api.test.ts           — implementation tests;
  - api.composition.ts    — composition of the module;
  - index.ts

…The other modules can access only the contents of api.composition.ts.

It’s clear that in JS you cannot completely forbid importing something from specific files. However, firstly, it expresses intention and structure, and secondly, the restriction can be enforced with a linter or other tools if desired.

On the other hand, such purism may not be necessary for a real project. Remember that the code is only experimental 🙃

Runtime Data Store

In addition to requests to the API, we also need a runtime storage for loaded exchange rates and values entered by users. Today we will write an implementation of the store using the Context API, but in the future we will look at more suitable tools and libraries for this task.

Ports and Implementation

Let’s start with an overview of the required functionality. The core of the application requires 2 functions from the store: for reading and saving model data.

// core/ports.output.ts

type ReadConverter = () => Converter;
type SaveConverter = (patch: Partial<Converter>) => void;

To implement this, we can create a context with this type:

// infrastructure/store

// The `Store` type describes the store.
// It's private so that neighboring modules do not depend
// on the details of the store implementation.
type Store = {
    value: Converter;
    update: SaveConverter;

    // As an option, we can also explicitly
    // create a function to read data,
    // but in the case of context, it's not necessary.
    read: ReadConverter;
};

const ConverterContext = createContext<Nullable<Store>>(null);
export const useStore = () => useContext(ConverterContext);

Then, we’ll create a provider:

// infrastructure/store

export const StoreProvider = ({ children }: PropsWithChildren) => {
    const [value, setValue] = useState<Converter>(initialModel);

    // If we're using a separate function for reading data
    // (this is not mandatory):
    const read = () => value;

    const update: StoreWriter = (patch) => setValue((state) => ({ ...state, ...patch }));

    return (
        <ConverterContext.Provider value={{ value, read, update }}>
            {children}
        ConverterContext.Provider>
    );
};

Implementing a store in this way will lead to unnecessary re-renders of components that depend on it. In real projects, try to avoid using context as a state manager and use appropriate libraries for this purpose.

Service Composition

Now we need to associate the types of application ports with the implementation of specific functions by “registering” the service:

// infrastructure/store.composition

import type { ReadConverter, SaveConverter } from '../../core/ports.output';
import { StoreProvider, useStore } from './store';

export const useStoreWriter: Provider<SaveConverter> = () => useStore().update;
export const useConverter: ReadConverter = () => useStore().value;

// If we need a separate function for reading data:
export const useStoreReader: Provider<ReadConverter> = () => useStore().read;

Note that we made the decision about which technology to use for the storage service only at the very end, when the application core was ready. This is a sign of fewer artificial constraints on our choice of tools. When we make a decision about the tooling, we already know a lot more about the project and can choose a more appropriate library for our tasks.

In one of the next posts, we will look at how to choose tools if there are constraints that have been discovered during the design phase, and how loose coupling between modules can help us.

Skipping Application Core

In addition to updating the converter via SaveConverter, we also need to read data from the store in the UI:

// shared/kernel.ts
type Selector<T> = () => T;

// core/ports.input.ts
type SelectBaseValue = Selector<BaseValue>;
type SelectQuoteValue = Selector<QuoteValue>;
type SelectQuoteCode = Selector<QuoteCurrencyCode>;

Since the application core is not involved in reading data (we do not transform data with domain functions when reading), we can implement input ports for reading directly in the store service:

// infrastructure/store.composition

import type { SelectBaseValue, SelectQuoteCode, SelectQuoteValue } from '../../core/ports.input';

const useValueBase: SelectBaseValue = () => useStore().value.baseValue;
const useQuoteCode: SelectQuoteCode = () => useStore().value.quoteCode;
const useValueQuote: SelectQuoteValue = () => useStore().value.quoteValue;

Such a “fast track” bypassing the application core can be used in applications where there is little or no domain logic.

Processes without domain logic and data transformations can be “short-circuited” and skipped past the core

Personally, I don’t see anything wrong with this implementation because the service is still connected to the rest of the application through abstractions, so the coupling between modules almost doesn’t increase.

(Almost) Everything Together

The application is almost ready. We have created the domain model and worked out use cases, created the UI layer and the necessary components, created services for API requests and data storage. Now we need to put all this together into a working project, which is what we will do next time.

Next Time

Today we implemented all the infrastructure of the application and connected it to the application’s output ports.

In the next post, we will compose the entire application from its parts, using hooks as a way of composition, and also discuss what other ways can be used for it.

Sources and References

Links to books, articles, and other materials I mentioned in this post.

Patterns and Principles

Functional Programming

Dependency Management and Architecture

React-Specific Topics

Other Topics

P.S. This post was originally published at bespoyasov.me. Subscribe to my blog to read posts like this earlier!

The post Explicit Design, Part 4. Ports, Adapters, and Infrastructure appeared first on ProdSens.live.

]]>
https://prodsens.live/2023/08/07/explicit-design-part-4-ports-adapters-and-infrastructure/feed/ 0
How to create a Currency Converter app using ExchangeRate REST API https://prodsens.live/2023/07/20/how-to-create-a-currency-converter-app-using-exchangerate-rest-api/?utm_source=rss&utm_medium=rss&utm_campaign=how-to-create-a-currency-converter-app-using-exchangerate-rest-api https://prodsens.live/2023/07/20/how-to-create-a-currency-converter-app-using-exchangerate-rest-api/#respond Thu, 20 Jul 2023 00:25:11 +0000 https://prodsens.live/2023/07/20/how-to-create-a-currency-converter-app-using-exchangerate-rest-api/ how-to-create-a-currency-converter-app-using-exchangerate-rest-api

It is impossible to underplay how crucial currency converters are for navigating the complex nature of the global…

The post How to create a Currency Converter app using ExchangeRate REST API appeared first on ProdSens.live.

]]>
how-to-create-a-currency-converter-app-using-exchangerate-rest-api

It is impossible to underplay how crucial currency converters are for navigating the complex nature of the global economy, whether they take the shape of web platforms, smartphone applications, or integrated banking systems.
The ability to accurately price goods and services across borders, as well as the ability to track changes in exchange rate valuations in real time, make currency conversion valuable in international trade, foreign exchange, travel and other areas of life.
This article demonstrates how to create a Currency Converter app in Vanilla JS using a REST API.

Pre-requisites for this project

  • Understanding of API interaction

  • An ExchangeRate-API account, create one here

  • Knowledge of jQuery animation

The repository for this project is located at Github; fork it to get started. A live demo of this app can also be found on Vercel.

Setting up the project

Including jQuery into the project

jQuery is a Javascript library that optimizes web development by providing solutions that shorten and simplify Javascript code. An instance of this is its collection of preset effects that can be used to manipulate the DOM.
To include jQuery in the app, we download it from jQuery and copy the jquery.min file from it into our app’s root directory.

Establishing a connection to the REST API

What is a REST API?

A RESTful API is a method for online information sharing and communication across various computer systems. It functions like a collection of guidelines that allow communication between software programs. When a client (such a web or mobile application) wants to receive or send data while using a REST API, It makes a request to the API which responds to the request by returning data that was requested by the client.

In this project, we require a REST API that can provide data containing up-to-date conversions between currencies, a great example which is used for this project is ExchangeRate-API. It also offers access to historical exchange rate data, allowing developers to retrieve rates for dates or past periods.
After creating an Exchange Rates API account, we head over to the dashboard to find our API key, URL, and information on our API usage. We can find the link to the documentation in the sidebar to learn more about ExchangeRate-API.

NOTE: Don’t share your ExchangeRate API key or URL

ExchangeRate-API Dashboard

Constructing the app

First, we create a file named index.js an insert the following code into the body tag:


        
class="logo">

currency converter class="fa fa-money">

class="msg">

class="actual-page"> action=""> for="amount">Amount type="number" id="amount" placeholder="0"> class="inputs"> class="from"> for="first-input">From name="from" id="first-input" onchange="updateCurrencyName()"> value="UGX">UGX - Ugandan shilling value="USD" selected>USD - United States dollar value="UYU">UYU - Uruguayan peso value="UZS">UZS - Uzbekistani soʻm value="VES">VES - Venezuelan bolívar class="to"> for="second-input">To name="to" id="second-input" onchange="updateCurrencyName()"> value="EUR" selected>EUR - Euro value="FJD">FJD - Fijian dollar value="FKP">FKP - Falkland Islands pound value="GBP">GBP - British pound value="GEL">GEL - Georgian lari class="btn" onclick="getExRate()" type="button">Convert class="fa fa-exchange">

In the code above:

-We create two select tags whose values represent the source and destination currencies respectively.

  • The value of the selected option tag is sent to the API and used to obtain conversion rates.

To include additional currencies in the app, more option tags can be added.
Next, the app is styled in style.css:

Next, we create a script.js file in the appp’s directory to store the code that interacts with the API to fetch the conversion rates.

//Define variables
var fromCurrency=document.querySelector('#first-input');
var toCurrency=document.querySelector('#second-input');
var button=document.querySelector('.btn');
var message=document.querySelector('.msg');
var input=document.getElementById('amount');
const submit=document.querySelector('.submit');
var outputText
const actualPage=document.querySelector('.actual-page');

The first step is to define the variables that will be used in this project. Some of these variables will be assigned to DOM elements.
Next, we develop a function that translates the display price figures to currency format and reduces them to a maximum of two fraction digits. To achieve this, we use Javascript’s Intl.NumberFormat which accepts two parameters namely:

  • Language which specifies what language the number is displayed in, e.g., ‘en-US’, ‘de-DE’, ‘en-GB’

  • A list of options used to customize the result

function formatToCurrency(number,currencyCode){
    var options={
        style:'currency',
        currency:currencyCode,
        maximumFractionDigits:2,
        currencyDisplay:'symbol',
    };
    const currencyFormatText=new Intl.NumberFormat('en-US',options).format(number);
    return currencyFormatText;
};   

The function above contains an object called options which contain the following properties:

  • style: This property determines the formatting style for the number, e.g., decimal, currency, percent

  • currency: This property specifies the currency code or symbol to be used for formatting the number as currency

  • maximumFractionDigits: This property specifies the maximum number of digits to display after the decimal point

  • currencyDisplay: This property determines how the currency should be displayed, e.g., symbol, code, name

Next up, we create an async function getExRate which awaits for the rates to be fetched from the api before calculating the conversion result using the rate between the currencies selected:

async function getExRate(){
    const amount=input.value;   
    const fromText=fromCurrency.value;
    const toText=toCurrency.value;
    const apiKey='72f99500f6844804f605d47c';
    const url =`https://v6.exchangerate-api.com/v6/${apiKey}/latest/USD`;
    const api=await fetch(url);
    const data=await api.json();
    const rates=data.conversion_rates;
    const exchangeRate=rates[toText]/rates[fromText];
    const result= exchangeRate*amount;
    const fromNumber=formatToCurrency(amount,fromText);
    const toNumber=formatToCurrency(result,toText);
    outputText=`${fromNumber} is equal to ${toNumber}`;
    message.textContent=outputText; 
};

The function in the code block above:

  • Collects the value of money to be converted, the currency it is being converted from, and the currency to be converted to

  • Defines a variable url to store the combination of the Exchange rates URL and API key.

  • Creates the variables api and data which fetches the data and converts it to a readable format respectively

  • Calculates the equivalent of the amount in the latter currency

Now that the functions needed for the currency conversion is complete, we call it whenever the convert button is clicked.

button.addEventListener('click',getExRate);

Creating animations with jQuery

Now that the functionality of the app is complete, we add animations that are performed once the app is loaded:

//screen load animations
$(document).ready(function(){
    $('.actual-page').fadeIn(1500);    
    $('.btn').animate({top:'0'},800);
    $('h1').animate({bottom:'0'},800);
    $('figure').animate({top:'0'},1200);
    $('label').animate({bottom:'0'},1000);
}
);

The jQuery code above is placed in a $(document).ready() function and is executed once only when the DOM is fully loaded.
fadeIn() used in the first function is one of the preset effects available in the JQuery library, to learn more on these effects, click here.
As for the remaining functions, the targeted elements have their position property set to relative, and have all been displaced in a direction. The code above reverts their displacement to the default position using the animate function.
In jQuery , DOM elements are accessed with the following methods:

  • By Tag Name e.g $('div')

  • By ID e.g $('#myElement')

  • By Class e.g $('.myClass')

  • By Using CSS Selectors e.g $('#myDiv .myClass')

  • By Traversing the DOM e.g .parent(), .children(), .siblings(), .find(), etc.

Conclusion

In summary, this article gives an overview of REST APIs and then demonstrates how to use JavaScript to retrieve data from ExchangeRate-API in a currency converter application. By following the steps mentioned, we are able to provide seamless currency conversion functionality for our application.

Resources

The post How to create a Currency Converter app using ExchangeRate REST API appeared first on ProdSens.live.

]]>
https://prodsens.live/2023/07/20/how-to-create-a-currency-converter-app-using-exchangerate-rest-api/feed/ 0
Fascinating Programming Facts You Need to Know https://prodsens.live/2023/04/03/fascinating-programming-facts-you-need-to-know/?utm_source=rss&utm_medium=rss&utm_campaign=fascinating-programming-facts-you-need-to-know https://prodsens.live/2023/04/03/fascinating-programming-facts-you-need-to-know/#respond Mon, 03 Apr 2023 06:02:30 +0000 https://prodsens.live/2023/04/03/fascinating-programming-facts-you-need-to-know/ fascinating-programming-facts-you-need-to-know

Programming is a fascinating field that has come a long way since its inception. Over the years, there…

The post Fascinating Programming Facts You Need to Know appeared first on ProdSens.live.

]]>
fascinating-programming-facts-you-need-to-know

Programming is a fascinating field that has come a long way since its inception. Over the years, there have been countless developments, advancements, and innovations in programming languages, tools, and technologies. With all these changes, it’s easy to overlook the history of programming and the interesting facts that have shaped it.

If you’re a programmer or just someone interested in the field, here are some great programming facts that you should know:

  1. The first computer virus was created in 1983 by a programmer named Fred Cohen. He was a graduate student at the University of Southern California, and his virus infected Apple II computers. The virus was called the “brain” virus because it targeted the boot sector of floppy disks and replaced it with a copy of itself.

  2. The world’s first computer, the Atanasoff-Berry Computer (ABC), was built in the late 1930s and early 1940s by John Atanasoff and Clifford Berry. The ABC was the first computer to use binary digits (bits) to represent data and to perform operations using electronic switches.

  3. The programming language Python was created by Guido van Rossum in the late 1980s. He named it after the Monty Python comedy group, of which he was a big fan. Python has since become one of the most popular programming languages in the world.

  4. The term “debugging” comes from Grace Hopper, a computer scientist who worked on the Harvard Mark II computer in the 1940s. One day, her team found a moth stuck in a relay and removed it. Hopper then used the term “debugging” to describe the process of fixing errors in code.

  5. The first computer game, Spacewar!, was created in 1962 by Steve Russell. It was played on a Digital PDP-1 computer and featured two spaceships battling each other. Spacewar! was a groundbreaking game that paved the way for the modern video game industry.

  6. The first hard disk drive was created by IBM in 1956. It was the size of a refrigerator and could store 5 MB of data. Today, hard disk drives are much smaller and can store terabytes of data.

  7. The programming language COBOL was designed in 1959 and is still used in some legacy systems today. COBOL stands for “Common Business-Oriented Language” and was designed to be easily readable by humans.

  8. The first text message was sent in 1992 by Neil Papworth, a software engineer in the UK. The message read “Merry Christmas” and was sent from a computer to a mobile phone.

  9. The first smartphone, the IBM Simon, was released in 1993. It had a touch screen, fax capability, and a calendar. The IBM Simon was a revolutionary device that paved the way for the modern smartphone.

  10. The first computer to beat a human at chess was Deep Blue, created by IBM. In 1997, it defeated world champion Garry Kasparov in a six-game match. Deep Blue was a landmark achievement in the field of artificial intelligence.

These are just a few of the many great programming facts out there. If you want to learn more about the history and evolution of programming, be sure to check out our blog post on “What are great programming facts?

So next time you’re writing code or tinkering with a computer, remember the fascinating history and interesting facts that have made programming what it is today. Happy programming!

Originally published at programmingeeksclub.com.

You can follow me on Twitter, Facebook, Telegram, YouTube, My Blog.

The post Fascinating Programming Facts You Need to Know appeared first on ProdSens.live.

]]>
https://prodsens.live/2023/04/03/fascinating-programming-facts-you-need-to-know/feed/ 0
A practical guide to creating a winning positioning and messaging strategy https://prodsens.live/2023/03/24/a-practical-guide-to-creating-a-winning-positioning-and-messaging-strategy/?utm_source=rss&utm_medium=rss&utm_campaign=a-practical-guide-to-creating-a-winning-positioning-and-messaging-strategy https://prodsens.live/2023/03/24/a-practical-guide-to-creating-a-winning-positioning-and-messaging-strategy/#respond Fri, 24 Mar 2023 15:03:54 +0000 https://prodsens.live/2023/03/24/a-practical-guide-to-creating-a-winning-positioning-and-messaging-strategy/ a-practical-guide-to-creating-a-winning-positioning-and-messaging-strategy

This article is based on a presentation from the Masters of Product Marketing event in October 2022. Catch…

The post A practical guide to creating a winning positioning and messaging strategy appeared first on ProdSens.live.

]]>
a-practical-guide-to-creating-a-winning-positioning-and-messaging-strategy

A practical guide to creating a winning positioning and messaging strategy

This article is based on a presentation from the Masters of Product Marketing event in October 2022. Catch up on this presentation and others with our OnDemand service.  

One of the most frequently asked questions in the PMA Select Group is, “Who has a messaging framework that I can use?” Messaging and positioning are some of the core activities of product marketing, yet many people still struggle with how to get them done and make sure that their organizations adopt them.

Even experienced product marketers sometimes get stumped when it comes to messaging and positioning, as most of us develop product marketing skills through trial and error. My early career would’ve been so much easier if PMA had been around with all their content and templates and frameworks.

Throughout this article, I’d like to provide you with some best practices and a process that you can adopt, adapt, and use in your own company the next time you’re faced with the challenge of crafting positioning and messaging for the products that you sell.

In this article, I’ll be exploring:

  • Product positioning
  • Positioning templates
  • Context
  • Data collection
  • The positioning process
  • What messaging is, and why it’s important
  • The messaging test
  • Messaging deployment

The post A practical guide to creating a winning positioning and messaging strategy appeared first on ProdSens.live.

]]>
https://prodsens.live/2023/03/24/a-practical-guide-to-creating-a-winning-positioning-and-messaging-strategy/feed/ 0