Archive

Archive for October, 2023

Quality Assurance in Software Testing: A Comprehensive Guide

October 12th, 2023 No comments

In today’s tech-driven world, software is the heartbeat of innovation. Software touches every aspect of our lives, from user-friendly apps to intricate business solutions. Yet, amidst this complexity, ensuring software quality is non-negotiable. This is where quality assurance in software testing steps in. QA is not a mere stage; it’s a mindset, a systematic approach ensuring the software meets high standards.

In this blog, we unravel the core of quality assurance in software testing. We’ll dive deep, from understanding its basics to exploring vital components and best practices. Whether you’re a seasoned professional or a curious beginner, we’ll demystify QA’s challenges, discussing innovative strategies. So let’s get started.

What is Quality Assurance in Software Testing?

Quality assurance is a systematic process. It is often referred to as quality management in software engineering and is employed to ensure that the software being developed meets customer requirements. Not only this! It involves a series of planned activities, processes, and methodologies. These are aimed at preventing defects and issues in the software development lifecycle. It holds utmost importance due to the following reasons:

  • Ensures reliability

QA methods rigorously test software, guaranteeing flawless performance under diverse conditions. Moreover, it fosters user reliance. It meticulously identifies and eliminates bugs. As a result, it ensures users experience consistent and dependable functionality.

  • Customer satisfaction

QA aligns software with customer expectations. As a result, it boosts satisfaction by delivering precisely what users anticipate. Furthermore, it ensures that user interfaces are intuitive and features are functional. Assurance of these elements leads to content and loyal users.

  • Cost-effectiveness

Early defect detection through QA reduces post-release costs. As a result, it ensures efficient use of resources during development. By identifying issues in the early stages, QA prevents costly fixes later. QA thereby optimizes the development process and budget allocation.

  • Brand reputation

Quality assurance in software testing services is essential to establishing a brand’s reputation. It also guarantees the excellent performance and dependability of the software. Delivering high-quality software on a continuous basis thereby improves the brand’s reputation. Moreover, it fosters user and stakeholder confidence. 

  • Compliance and security

Software compliance with industry rules and standards is ensured by QA. As a result, it strengthens security protocols and safeguards important information. QA guarantees that the program is resistant to cyber attacks by thoroughly testing security mechanisms. Additionally, it protects both user information and the credibility of the company.

  • Optimized performance

Performance bottlenecks are found and fixed through QA, ensuring the product runs effectively. This optimization guarantees a seamless user experience, even during high-traffic periods. 

Many people tend to confuse quality assurance in software testing with quality control. However, both terms show some differences. What are they, you ask? Let’s find out.

What Difference do Quality Assurance and Quality Control Hold?

Quality assurance is a proactive and process-oriented approach that focuses on preventing defects before they occur. Therefore, it entails using systematic methods and activities across the SDLC. These rules guarantee that the item conforms to all relevant requirements and standards. QA strongly emphasizes process improvement, improving them over time and using the best practices. It’s all about developing methods to stop mistakes from occurring.

To guarantee a high-quality outcome, QC adopts a proactive approach. To identify and address problems with the completed product, particular steps and techniques must be followed. Also, QC employs processes including testing, inspections, and reviews to find and fix problems. The primary objective of quality control in software engineering is to identify flaws in the finished product and confirm that it adheres to the desired quality standards.

Let us now go deeper into quality assurance in software testing and understand its key components.

What are the Key Components of Quality Assurance?

Each of the vital components of QA makes a difference in some manner to the process of testing software. In this part, we will discuss three crucial components, emphasizing their significance and connection:

  • Test planning and strategy

Test planning is the first step in the quality assurance in software testing. It demands the creation of a test strategy that outlines the testing’s objectives, limitations, and other features. Moreover, this stage guides the subsequent testing procedures and creates the structure for the entire QA process.

  • Test design and execution

In circumstances where a plan is in place, QA companies offer comprehensive test cases and scenarios. It closely conforms to the project’s requirements and user scenarios. These test scenarios outline the testing processes. QA specialists may manually execute these scenarios or use automated testing technologies. Further use of regression testing is made. The process ensures that updated code does not adversely affect features that currently exist.

  • Defect reporting and tracking

During testing, QA engineers identify, document, and report defects and issues. They meticulously record each defect with detailed information. As a result, it enables developers to understand the problem fully. Teams prioritize and track these defects throughout their lifecycle.

  • Performance testing and optimization

Performance testing is crucial to evaluate the software’s responsiveness, stability, etc. The testing tools simulate user loads, enabling the identification of bottlenecks and areas of improvement. Furthermore, once identified, teams optimize the software based on the testing results to address performance issues.

  • Continuous improvement

Post-testing, an analysis of testing outcomes and user feedback is conducted. This analysis helps identify areas for improvement within QA processes. So, one incorporates lessons learned from past projects and establishes iterative feedback mechanisms. Moreover, it ensures the software is becoming increasingly efficient and effective, aligning with changing user needs.

Now, are there any practices you can maintain to boost the efficiency of quality assurance in software testing? Yes, there are! Let’s find out what they are.

Quality Assurance in Software Testing: Best Practices

Quality assurance in software testing is not just a phase but a mindset. It is a system of rules and procedures that ensures the distribution of superior software goods. In order to maintain effectiveness and dependability throughout the development lifecycle, best practices in QA must be implemented:

  • Clear and detailed test cases

Build comprehensive test cases that cover a variety of scenarios and edge cases. QA engineers are guided by clear, thorough test cases. It also makes it possible to test thoroughly and consistently. So, these situations have to be clear and well-documented.

  • Comprehensive test planning

Careful test planning is the foundation of effective quality assurance in software testing. Establish precise goals, boundaries, budgets, and deadlines. A well-structured test plan also offers QA activities a roadmap. As a result, it guarantees that every component of the software is carefully inspected.

  • Automation where appropriate

Automation accelerates repetitive and time-consuming testing tasks. As a result, it ensures rapid feedback during development. Implement test automation for regression tests, smoke tests, and repetitive scenarios. It allows QA engineers to focus on complex, exploratory testing and automate the quality assurance process.

  • Continuous integration and continuous testing

Utilise CI and CT to include quality assurance in software testing when it is still in the development phase. Automate testing as part of the CI/CD cycle to help developers see problems early. This results in quicker problem fixes and better program stability.

  • Realistic test data management

Recreate real-world scenarios using a range of tests and realistic data. In order to ensure the software’s resilience, test data should span a range of inputs. Realistic test results can aid in spotting possible problems. These are the problems in handling and validating data.

  • Rigorous defect reporting and tracking

Implement a robust defect reporting and tracking system. Clearly, document defects, providing detailed information about the issue. Furthermore, prioritize defects based on severity and track their progress until resolution.

To Sum Up

Quality assurance in software testing sits at the core of flawless software. You need to be comprehensive in your approach to QA. Through our blog, we have tried to give you elements that can help you achieve that. So don’t wait any further and take your software testing to the next level!

Featured image by Rezvani on Unsplash

The post Quality Assurance in Software Testing: A Comprehensive Guide appeared first on noupe.

Categories: Others Tags:

The 12 Most Controversial Ad Campaigns of the 21st Century

October 11th, 2023 No comments

How far would an organization be willing to go for the chance to generate a little extra buzz? In this list, we’re going to find out.

Categories: Designing, Others Tags:

Why are Email Signatures Necessary in the World of Business?

October 11th, 2023 No comments

Every day, roughly 4 billion people communicate via email. This includes, of course, those who take to this medium to conduct business. If email is a strong part of your daily business interactions, then you’ll want to read this.

When crafting the perfect email that you want your recipient to read carefully and respond to, it’s not enough to come up with a catchy subject line and a juicy introduction. The way you sign off your message is just as important to keep that conversation going.

Specifically, we’re talking about your email signature. Not only are email signatures necessary if you want to provide some essential details about yourself, but they can also generate some impressive and perhaps unexpected benefits. Let’s find out more.

What is an email signature?

Not to be confused with a digital signature, an email signature refers to the block of text that email users place at the bottom of a message and where they include any relevant business details about themselves and their company. 

Additionally, many email signatures also feature some visual elements, such as a headshot of the sender or the company logo. It’s important to place your email signature at the very end of your email, preferably separated from the main body with a clear line or another visual cue.

While it is, of course, essential to ensure that your email signature is as comprehensive and informative as possible, you’ll also want to be wary of creating a signature that overwhelms the reader by providing too much information. 

Similarly, you’ll want to keep your email signature size fairly small, so that it doesn’t stand out abruptly and confuse the recipient while they’re reading your message. But let’s take a closer look at the best practices to craft an effective email signature.

The dos and dont’s of a professional email signature

Do: Include your full name

It may sound obvious, but the first element you’ll want to include in your email signature is your full name. It doesn’t matter if you are also used to signing off your email by using your first name. As your email signature is a separate, independent block of text, it should feature both your first and last name.

Don’t: Add any confidential information

Personal details such as your home address, private phone number, and any links to your personal social media accounts should be avoided.

Do: Incorporate visuals

While you may not necessarily need (or want) to include a photo of yourself in your email signature, it’s important to display a logo of the company you work for, to establish trust and help strengthen brand identity (more on that later).

Don’t: Be overwhelmed with information

As we mentioned earlier, you don’t need your email signature to be packed with information that might end up putting off the reader. Your full name, job title, business contact details, company name (and logo), and company website are often more than enough.

Image by Cytonn Photography on Unsplash

Do: Add relevant business links

Have you recently won an award? Has your company just launched an advanced enterprise cloud communications platform? Do you want to promote a press release? It may be worth including some of these business links in your email signature, too.

Don’t: Include any personal links

While you might be tempted to add your personal Instagram or Twitter handle to your email signature in order to gain more exposure and win a few more followers, it’s important that you refrain from doing so. Email signatures should only have business-related purposes, and it’s crucial that you don’t mix your professional and personal lives.

Are email signatures necessary? Seven reasons why you need them

If you’re still asking yourself, “Are email signatures necessary?” then keep reading as we reveal the seven main reasons why they, indeed, are.

  1. They increase brand awareness

Is your brand new to the industry? An email signature can become your best friend. It’s a quick and easy way to stick in the minds of your readers, as they’ll be able to associate your name with a specific brand, and your brand with a specific logo or website.

All this, in turn, helps you to boost brand awareness, which is something all brands benefit from, especially small and young ones.

  1. They showcase expertise and professionalism

How many times have you received an email from someone you didn’t know and binned it because it didn’t look “legit”? Well, if that resonates, it might be because that person either didn’t have an email signature, or their email signature was poorly written.

By crafting an email signature that includes verifiable links, detailed information, and other credible sources such as your preferred cloud communications method, you’ll instantly come across as a serious and trustworthy professional. People will no longer suspect that your email might be spam, and will feel more eager to connect with you and get to know your brand better.

Image by ThisIsEngineering on Pexels
  1. They make it easy for people to contact you

How frustrating is it when you’ve received someone’s email and have no way of tracking their company website or business phone number? Well, one of the most important benefits of having a clear and compelling email signature is the ability for your recipients to get in touch with you quickly and easily. 

Sure, you’ll want to spend some time putting together an email signature that looks easy on the eye and reflects your brand’s identity, but at the same time, you’ll want to focus on its main goal: making it easier for people to contact you.

Image by Rohit Tandon on Unsplash
  1. They help your personality stand out

We touched on this earlier (and will expand on it in a moment): email signatures are a great tool to help you consolidate your brand identity. This happens through the use of your company logo, company website, and any other typography or visual elements that make your brand unique and recognizable.

However, this doesn’t mean that every single email signature that people from the same company create should look exactly the same. In some cases, your company may give you some leeway in what you add to your email signatures besides the basics.

For example, it’s not unheard of for people to incorporate a brief quote they love at the bottom of their email signature. Similarly, you may be allowed to switch the company’s main font for your favorite one, while keeping all the other main elements on-brand.

  1. They boost web and social traffic

Adding your company’s website to your email signature is a surefire way to grow your web traffic organically. In parallel, you may also want to add other relevant business links, such as your company’s LinkedIn page, blog page, or anything else that might help boost traffic, visibility, and engagement.

  1. They consolidate brand identity

Whether you run a nimble startup or a large multinational, you’ll want to keep your brand identity solid, coherent, and cohesive across all your channels. And, you’ve guessed it, email signatures are one of the tools you can leverage to showcase your brand, make it memorable, and bring more people to it.

If you want to achieve this, though, you need to make sure that you have a standard set of rules in place for creating email signatures across your company. These should include adding your company logo, website, and other links, as well as using your brand’s color palette.

Image by Mitchell Luo on Unsplash
  1. They support your marketing efforts

You may not have thought about this, but an email signature can also double as a powerful marketing tool. As we mentioned earlier, you might have just launched a marketing campaign, or a new product that you want your customers to check out.

By including an interactive link – or, even better, a banner – to your email signature, you maximize the results of whatever you’re trying to promote, with no need to invest money in any additional marketing activities.

The bottom line

You may have approached this article because you’ve been wondering, “are email signatures necessary in 2023?” and hopefully you are coming away from this with a clear idea as to why they are.

With an email signature, you can establish trust, foster connections, and reinforce brand identity. Now that you know exactly how to write a fabulous email signature, why not go ahead and craft yours?

Featured image by Solen Feyissa on Unsplash

The post Why are Email Signatures Necessary in the World of Business? appeared first on noupe.

Categories: Others Tags:

A High-Level Overview Of Large Language Model Concepts, Use Cases, And Tools

October 10th, 2023 No comments

Even though a simple online search turns up countless tutorials on using Artificial Intelligence (AI) for everything from generative art to making technical documentation easier to use, there’s still plenty of mystery around it. What goes inside an AI-powered tool like ChatGPT? How does Notion’s AI feature know how to summarize an article for me on the fly? Or how are a bunch of sites suddenly popping up that can aggregate news and auto-publish a slew of “new” articles from it?

It all can seem like a black box of mysterious, arcane technology that requires an advanced computer science degree to understand. What I want to show you, though, is how we can peek inside that box and see how everything is wired up.

Specifically, this article is about large language models (LLMs) and how they “imbue” AI-powered tools with intelligence for answering queries in diverse contexts. I have previously written tutorials on how to use an LLM to transcribe and evaluate the expressed sentiment of audio files. But I want to take a step back and look at another way around it that better demonstrates — and visualizes — how data flows through an AI-powered tool.

We will discuss LLM use cases, look at several new tools that abstract the process of modeling AI with LLM with visual workflows, and get our hands on one of them to see how it all works.

Large Language Models Overview

Forgoing technical terms, LLMs are vast sets of text data. When we integrate an LLM into an AI system, we enable the system to leverage the language knowledge and capabilities developed by the LLM through its own training. You might think of it as dumping a lifetime of knowledge into an empty brain, assigning that brain to a job, and putting it to work.

“Knowledge” is a convoluted term as it can be subjective and qualitative. We sometimes describe people as “book smart” or “street smart,” and they are both types of knowledge that are useful in different contexts. This is what artificial “intelligence” is created upon. AI is fed with data, and that is what it uses to frame its understanding of the world, whether it is text data for “speaking” back to us or visual data for generating “art” on demand.

Use Cases

As you may imagine (or have already experienced), the use cases of LLMs in AI are many and along a wide spectrum. And we’re only in the early days of figuring out what to make with LLMs and how to use them in our work. A few of the most common use cases include the following.

  • Chatbot
    LLMs play a crucial role in building chatbots for customer support, troubleshooting, and interactions, thereby ensuring smooth communications with users and delivering valuable assistance. Salesforce is a good example of a company offering this sort of service.
  • Sentiment Analysis
    LLMs can analyze text for emotions. Organizations use this to collect data, summarize feedback, and quickly identify areas for improvement. Grammarly’s “tone detector” is one such example, where AI is used to evaluate sentiment conveyed in content.
  • Content Moderation
    Content moderation is an important aspect of social media platforms, and LLMs come in handy. They can spot and remove offensive content, including hate speech, harassment, or inappropriate photos and videos, which is exactly what Hubspot’s AI-powered content moderation feature does.
  • Translation
    Thanks to impressive advancements in language models, translation has become highly accurate. One noteworthy example is Meta AI’s latest model, SeamlessM4T, which represents a big step forward in speech-to-speech and speech-to-text technology.
  • Email Filters
    LLMs can be used to automatically detect and block unwanted spam messages, keeping your inbox clean. When trained on large datasets of known spam emails, the models learn to identify suspicious links, phrases, and sender details. This allows them to distinguish legitimate messages from those trying to scam users or market illegal or fraudulent goods and services. Google has offered AI-based spam protection since 2019.
  • Writing Assistance
    Grammarly is the ultimate example of an AI-powered service that uses LLM to “learn” how you write in order to make writing suggestions. But this extends to other services as well, including Gmail’s “Smart Reply” feature. The same thing is true of Notion’s AI feature, which is capable of summarizing a page of content or meeting notes. Hemmingway’s app recently shipped a beta AI integration that corrects writing on the spot.
  • Code and Development
    This is the one that has many developers worried about AI coming after their jobs. It hit the commercial mainstream with GitHub Copilot, a service that performs automatic code completion. Same with Amazon’s CodeWhisperer. Then again, AI can be used to help sharpen development skills, which is the case of MDN’s AI Help feature.

Again, these are still the early days of LLM. We’re already beginning to see language models integrated into our lives, whether it’s in our writing, email, or customer service, among many other services that seem to pop up every week. This is an evolving space.

Types Of Models

There are all kinds of AI models tailored for different applications. You can scroll through Sapling’s large list of the most prominent commercial and open-source LLMs to get an idea of all the diverse models that are available and what they are used for. Each model is the context in which AI views the world.

Let’s look at some real-world examples of how LLMs are used for different use cases.

Natural Conversation
Chatbots need to master the art of conversation. Models like Anthropic’s Claude are trained on massive collections of conversational data to chat naturally on any topic. As a developer, you can tap into Claude’s conversational skills through an API to create interactive assistants.

Emotions
Developers can leverage powerful pre-trained models like Falcon for sentiment analysis. By fine-tuning Falcon on datasets with emotional labels, it can learn to accurately detect the sentiment in any text provided.

Translation
Meta AI released SeamlessM4T, an LLM trained on huge translated speech and text datasets. This multilingual model is groundbreaking because it translates speech from one language into another without an intermediary step between input and output. In other words, SeamlessM4T enables real-time voice conversations across languages.

Content Moderation
As a developer, you can integrate powerful moderation capabilities using OpenAI’s API, which includes a LLM trained thoroughly on flagging toxic content for the purpose of community moderation.

Spam Filtering
Some LLMs are used to develop AI programs capable of text classification tasks, such as spotting spam emails. As an email user, the simple act of flagging certain messages as spam further informs AI about what constitutes an unwanted email. After seeing plenty of examples, AI is capable of establishing patterns that allow it to block spam before it hits the inbox.

Not All Language Models Are Large

While we’re on the topic, it’s worth mentioning that not all language models are “large.” There are plenty of models with smaller sets of data that may not go as deep as ChatGPT 4 or 5 but are well-suited for personal or niche applications.

For example, check out the chat feature that Luke Wrobleski added to his site. He’s using a smaller language model, so the app at least knows how to form sentences, but is primarily trained on Luke’s archive of blog posts. Typing a prompt into the chat returns responses that read very much like Luke’s writings. Better yet, Luke’s virtual persona will admit when a topic is outside of the scope of its knowledge. An LLM would provide the assistant with too much general information and would likely try to answer any question, regardless of scope. Members from the University of Edinburgh and the Allen Institute for AI published a paper in January 2023 (PDF) that advocates the use of specialized language models for the purpose of more narrowly targeted tasks.

Low-Code Tools For LLM Development

So far, we’ve covered what an LLM is, common examples of how it can be used, and how different models influence the AI tools that integrate them. Let’s discuss that last bit about integration.

Many technologies require a steep learning curve. That’s especially true with emerging tools that might be introducing you to new technical concepts, as I would argue is the case with AI in general. While AI is not a new term and has been studied and developed over decades in various forms, its entrance to the mainstream is certainly new and sparks the recent buzz about it. There’s been plenty of recent buzz in the front-end development community, and many of us are scrambling to wrap our minds around it.

Thankfully, new resources can help abstract all of this for us. They can power an AI project you might be working on, but more importantly, they are useful for learning the concepts of LLM by removing advanced technical barriers. You might think of them as “low” and “no” code tools, like WordPress.com vs. self-hosted WordPress or a visual React editor that is integrated with your IDE.

Low-code platforms make it easier to leverage large language models without needing to handle all the coding and infrastructure yourself. Here are some top options:

Chainlit

Chainlit is an open-source Python package that is capable of building a ChatGPT-style interface using a visual editor.

LLMStack is another low-code platform for building AI apps and chatbots by leveraging large language models. Multiple models can be chained together into “pipelines” for channeling data. LLMStack supports standalone app development but also provides hosting that can be used to integrate an app into sites and products via API or connected to platforms like Slack or Discord.

LLMStack is also what powers Promptly, a cloud version of the app with freemium subscription pricing that includes a free tier.

FlowiseAI

Stack AI is another no-code offering for developing AI apps integrated with LLMs. It is much like FlowiseAI, particularly the drag-and-drop interface that visualizes connections between apps and APIs. One thing I particularly like about Stack AI is how it incorporates “data loaders” to fetch data from other platforms, like Slack or a Notion database.

I also like that Stack AI provides a wider range of LLM offerings. That said, it will cost you. While Stack AI offers a free pricing tier, it is restricted to a single project with only 100 runs per month. Bumping up to the first paid tier will set you back $199 per month, which I suppose is used toward the costs of accessing a wider range of LLM sources. For example, Flowise AI works with any LLM in the Hugging Face community. So does Stack AI, but it also gives you access to commercial LLM offerings, like Anthropic’s Claude models and Google’s PaLM, as well as additional open-source offerings from Replicate.

Voiceflow

Install FlowiseAI

First things first, we need to get FlowiseAI up and running. FlowiseAI is an open-source application that can be installed from the command line.

You can install it with the following command:

npm install -g flowise

Once installed, start up Flowise with this command:

npx flowise start

From here, you can access FlowiseAI in your browser at localhost:3000.

It’s possible to serve FlowiseAI so that you can access it online and provide access to others, which is well-covered in the documentation.

Setting Up Retrievers

Retrievers are templates that the multi-prompt chain will query.

Different retrievers provide different templates that query different things. In this case, we want to select the Prompt Retriever because it is designed to retrieve documents like PDF, TXT, and CSV files. Unlike other types of retrievers, the Prompt Retriever does not actually need to store those documents; it only needs to fetch them.

Let’s take the first step toward creating our career assistant by adding a Prompt Retriever to the FlowiseAI canvas. The “canvas” is the visual editing interface we’re using to cobble the app’s components together and see how everything connects.

Adding the Prompt Retriever requires us to first navigate to the Chatflow screen, which is actually the initial page when first accessing FlowiseAI following installation. Click the “Add New” button located in the top-right corner of the page. This opens up the canvas, which is initially empty.

The “Plus” (+) button is what we want to click to open up the library of items we can add to the canvas. Expand the Retrievers tab, then drag and drop the Prompt Retriever to the canvas.

The Prompt Retriever takes three inputs:

  1. Name: The name of the stored prompt;
  2. Description: A brief description of the prompt (i.e., its purpose);
  3. Prompt system message: The initial prompt message that provides context and instructions to the system.

Our career assistant will provide career suggestions, tool recommendations, salary information, and cities with matching jobs. We can start by configuring the Prompt Retriever for career suggestions. Here is placeholder content you can use if you are following along:

  • Name: Career Suggestion;
  • Description: Suggests careers based on skills and experience;
  • Prompt system message: You are a career advisor who helps users identify a career direction and upskilling opportunities. Be clear and concise in your recommendations.

Be sure to repeat this step three more times to create each of the following:

  • Tool recommendations,
  • Salary information,
  • Locations.

Adding A Multi-Prompt Chain

A Multi-Prompt Chain is a class that consists of two or more prompts that are connected together to establish a conversation-like interaction between the user and the career assistant.

The idea is that we combine the four prompts we’ve already added to the canvas and connect them to the proper tools (i.e., chat models) so that the career assistant can prompt the user for information and collect that information in order to process it and return the generated career advice. It’s sort of like a normal system prompt but with a conversational interaction.

The Multi-Prompt Chain node can be found in the “Chains” section of the same inserter we used to place the Prompt Retriever on the canvas.

Once the Multi-Prompt Chain node is added to the canvas, connect it to the prompt retrievers. This enables the chain to receive user responses and employ the most appropriate language model to generate responses.

To connect, click the tiny dot next to the “Prompt Retriever” label on the Multi-Prompt Chain and drag it to the “Prompt Retriever” dot on each Prompt Retriever to draw a line between the chain and each prompt retriever.

Integrating Chat Models

This is where we start interacting with LLMs. In this case, we will integrate Anthropic’s Claude chat model. Claude is a powerful LLM designed for tasks related to complex reasoning, creativity, thoughtful dialogue, coding, and detailed content creation. You can get a feel for Claude by registering for access to interact with it, similar to how you’ve played around with OpenAI’s ChatGPT.

From the inserter, open “Chat Models” and drag the ChatAnthropic option onto the canvas.

Once the ChatAnthropic chat model has been added to the canvas, connect its node to the Multi-Prompt Chain’s “Language Model” node to establish a connection.

It’s worth noting at this point that Claude requires an API key in order to access it. Sign up for an API key on the Anthropic website to create a new API key. Once you have an API key, provide it to the Mutli-Prompt Chain in the “Connect Credential” field.

Adding A Conversational Agent

The Agent component in FlowiseAI allows our assistant to do more tasks, like accessing the internet and sending emails.

It connects external services and APIs, making the assistant more versatile. For this project, we will use a Conversational Agent, which can be found in the inserter under “Agent” components.

Once the Conversational Agent has been added to the canvas, connect it to the Chat Model to “train” the model on how to respond to user queries.

Integrating Web Search Capabilities

The Conversational Agent requires additional tools and memory. For example, we want to enable the assistant to perform Google searches to obtain information it can use to generate career advice. The Serp API node can do that for us and is located under “Tools” in the inserter.

Like Claude, Serp API requires an API key to be added to the node. Register with the Serp API site to create an API key. Once the API is configured, connect Serp API to the Conversational Agent’s “Allowed Tools” node.

Building In Memory

The Memory component enables the career assistant to retain conversation information.

This way, the app remembers the conversation and can reference it during the interaction or even to inform future interactions.

There are different types of memory, of course. Several of the options in FlowiseAI require additional configurations, so for the sake of simplicity, we are going to add the Buffer Memory node to the canvas. It is the most general type of memory provided by LangChain, taking the raw input of the past conversation and storing it in a history parameter for reference.

Buffer Memory connects to the Conversational Agent’s “Memory” node.

The Final Workflow

At this point, our workflow looks something like this:

  • Four prompt retrievers that provide the prompt templates for the app to converse with the user.
  • A multi-prompt chain connected to each of the four prompt retrievers that chooses the appropriate tools and language models based on the user interaction.
  • The Claude language model connected to the multi-chain prompt to “train” the app.
  • A conversational agent connected to the Claude language model to allow the app to perform additional tasks, such as Google web searches.
  • Serp API connected to the conversational agent to perform bespoke web searches.
  • Buffer memory connected to the conversational agent to store, i.e., “remember,” conversations.

If you haven’t done so already, this is a great time to save the project and give it a name like “Career Assistant.”

Final Demo

Watch the following video for a quick demonstration of the final workflow we created together in FlowiseAI. The prompts lag a little bit, but you should get the idea of how all of the components we connected are working together to provide responses.

Conclusion

As we wrap up this article, I hope that you’re more familiar with the concepts, use cases, and tools of large language models. LLMs are a key component of AI because they are the “brains” of the application, providing the lens through which the app understands how to interact with and respond to human input.

We looked at a wide variety of use cases for LLMs in an AI context, from chatbots and language translations to writing assistance and summarizing large blocks of text. Then, we demonstrated how LLMs fit into an AI application by using FlowiseAI to create a visual workflow. That workflow not only provided a visual of how an LLM, like Claude, informs a conversation but also how it relies on additional tools, such as APIs, for performing tasks as well as memory for storing conversations.

The career assistant tool we developed together in FlowiseAI was a detailed visual look inside the black box of AI, providing us with a map of the components that feed the app and how they all work together.

Now that you know the role that LLMs play in AI, what sort of models would you use? Is there a particular app idea you have where a specific language model would be used to train it?

References

Categories: Others Tags:

The Business Case for Sustainability: Balancing Profitability and Environmental Responsibility 

October 10th, 2023 No comments

Investors have embraced responsible portfolio management strategies to encourage sustainable enterprises and support socio-economic development. Meanwhile, customers refuse to buy from a brand that fails to curb labor malpractices, pollution, waste generation, and petroleum consumption. This post will describe the business case for sustainability to increase awareness about these trends. 

What is Sustainable Business Development? 

A company engages in sustainable business development when it revises its operations, product design, and resource allocation to contribute to social and environmental problem resolution. It is not about pretending to be eco-friendly or slowing industrial progress. Instead, sustainability for business ensures companies can thrive without harming social harmony and Earth’s resources. 

Today, business leaders leverage?sustainability consulting services?to navigate modern regulations demanding more responsible corporate approaches. Besides, several pressing matters range from safekeeping consumer data to making workplaces more inclusive. 

At the same time, multiple compliance guidelines have overwhelmed managers. So, it is imperative to embrace a tech-led strategy. It will help increase your firm’s compliance across all the major frameworks, like the ones described below. 

  1. Environmental, social, and governance (ESG) reporting
  2. Task force on climate-related financial disclosures (TCFD), 
  3. Global Reporting Initiative (GRI), 
  4. And the EU taxonomy. 

How Can a Business Balance Profitability, Ethics, and Sustainability? 

The older the organization, the more challenges you must overcome to go green. An excellent method is multistakeholder brainstorming. Let customers, suppliers, employees, business associates, and investors chime in and provide improvement ideas. 

Another indirect approach involves taking advantage of extensive data collection methods, insight extraction, and reporting. Using automated computing systems, companies can monitor the policy dynamics in the target markets and improve specific operations in realistic stages. 

They do not need to transform all practices and risk productivity loss. Since they will utilize data from authoritative sources, their decisions will also have a sound foundation. Available technologies can involve? ESG data solutions tailored for private companies, financial materiality estimates, controversy analytics, and risk forecasting tools. 

Finally, leaders, board directors, and the rest must periodically evaluate their business sustainability initiatives. If they notice some strategies becoming obsolete, they must devise appropriate action plans to rectify such issues. 

Advantages of Business Sustainability 

1- Efficient Resource Consumption 

Pollution and carbon risk mitigation require brands to replace conventional energy systems with greener alternatives. This renewable energy transition allows companies to rationalize how they allocate resources to operations. Moreover, they can reduce dependence on public infrastructure for power and water using modern technologies. 

Treating and reusing water might not be suitable for all enterprises. However, the scope of these practices encompasses offices, factories, and post-sales product maintenance. In other words, you want to consider the entire product lifecycle to increase your ESG ratings and positive impact potential. 

Integrating green technology to fulfill the efficient resource consumption requirements makes you more competitive and attracts more investors. Therefore, business profitability increases thanks to sustainability accounting compliance. 

2- Resilient Supply Chains 

Socio-economic and ecological threats limit your enterprise’s growth potential. They endanger the well-being of consumers and supply partners. Consider how environmental problems, political chaos, or social issues hinder free transportation, making timely product delivery more arduous. 

However, brands can voluntarily work toward building a peaceful, green, tolerant, and resilient community. They must collaborate with employees, educators, policymakers, and local stakeholders. After all, most corporate social responsibility (CSR) projects aimed at literacy increase, women empowerment, and cyber safety awareness create opportunities to create a more stable world. 

Aside from social disharmony threats, your supply chain is often vulnerable to fraud, region-specific quality norm inconsistencies, and controversies. You cannot eliminate these risks, but you can reduce the harm they might cause using predictive analysis and contingency plans. Many sustainability frameworks address these aspects in their reporting guidelines. 

3- Long-Term Stakeholder Relationships 

Responsible consumption and a solid supply chain increase an organization’s reputation. Socially conscious customers prefer companies that realize the cost of human-caused industrial activities. Therefore, they want leaders to embrace business sustainability, transparent communication, and ethical human resource practices. 

Simultaneously, social networking sites (SNS) have empowered individuals to voice their disappointment with brands that fail to improve compliance. So, customers will likely stop purchasing from you if you lag behind competitors in sustainable business development. 

Conversely, corporations with adequate CSR programs get loyal customers, free press, positive value association, and investor goodwill. They become leaders in establishing new industry norms while others struggle to understand sustainability accounting principles. 

Precaution: Greenwashing is Not a Business Case for Sustainability 

Consider the following: 

  1. What can anyone do if companies manipulate their financial and carbon disclosures? 
  2. Will investors, regulators, and customers trust other brands who also report on sustainability or ESG performance metrics? 
  3. What types of green claims can an organization include in its marketing campaigns? 
  4. How do we verify that a brand’s reported CSR outcomes are genuine and tangible? 
  5. Can ESG disclosures backfire and expose your company to controversies and misinformation attacks?

These are legitimate fears expressed by many because of the greenwashing cases. The perpetrators use deceptive verbal and design tactics to boast about on-paper CSR achievements with no on-ground impact. Some claimed they use 100% renewable energy by cunningly omitting crucial reporting elements. Others had suppliers employing child labor in life-threatening working conditions. 

Greenwashing hurts stakeholder trust in ESG, TCFD, and GRI documentation. When one company receives greenwashing allegations, others in the same industry also attract criticism. Sooner or later, the media picks up the story, and the hard-earned brand reputation evaporates into infinity. 

Avoid greenwashing and disassociate with partners, municipalities, and suppliers doing it. 

Conclusion 

Leaders who recognize the significance of sustainable business development are visionaries. They know their business can thrive if the consumers, employees, investors, and regulators are happy with their work. So, the world has witnessed a rekindled interest in ethics-driven corporate attitudes and investment strategies. 

Reducing byproduct generation, enforcing anti-harassment policies, and adopting practical data governance standards make brands more sustainable. Their supply chain resilience increases while more stakeholders trust them. 

Nevertheless, greenwashing risks prevent organizations and investors from unlocking the full potential business sustainability use cases. Therefore, all the stakeholders must be honest with compliance reporting. It is okay if your ESG ratings are low because you can implement initiatives and work with experts to improve them. 

In the end, only transparency matters. Without it, sustainability reporting will become a worthless formality. However, with the proper oversight, the opposite will happen, and your organization will surpass all competitors while solving social and environmental problems.  

Featured Image by Daniel Öberg on Unsplash

The post The Business Case for Sustainability: Balancing Profitability and Environmental Responsibility  appeared first on noupe.

Categories: Others Tags:

Guarding the Gateway: How to Protect Your Online Forms from Security Risks

October 9th, 2023 No comments

Internet connectivity has brought light to every dark corner of the world, and businesses are embracing digital tools and techniques to make their work processes efficient. 

Online forms or web forms are ubiquitous in today’s digital landscape and play a pivotal role in online activities. Today, 74% of companies make use of web forms to help them in lead generation. The prevalence of online forms is driven by digital transformation, eCommerce, information gathering, better communication, job applications, event registration, government services, etc.

Image by Pixabay on Pexels

Online forms are very easy to use and are great for communicating with audiences. However, they are vulnerable to attacks from malware and hackers. This may result in leaks of confidential information that may deter customers from tuning in to your offering. In this article, we’ll offer a step-by-step guide to keep your online forms safe and secure.

Why Online Forms Are Critical

The ultimate goal of any business is to generate a sustainable profit using successful lead generation and conversion tools. In today’s time, if a company has failed to create pages or online forms that are asking visitors to fill in their details, then their marketing strategy is aimless.

Online forms are interactive web pages that will allow users to input their answers. The data that is entered by the user is directly received by the main server for processing. It streamlines the entire process of data collection and is a cost-effective digital solution. The forms are easily accessible anywhere and are great for customer engagements, especially for those organizations that have a diverse customer base – usually industries like insurance, tourism, hospitality, and financial services like simple loans or credit reports. Users can fill them at their convenience, and they are processed quickly. If there is an increase in the number of users and submissions, it can be scaled to handle huge volumes without any manual effort.

An online form can be customized and integrated with software, allowing for automated data processing. These forms come with analytics tools that offer valuable insights into user behavior and understanding of their responses. This data is valuable to make informed decisions to improve your offering and overall user experience.

Many major companies today are built around information systems derived from forms or other sources. Some of these include eBay, Amazon, Cloud computing services, and Alibaba. Even Google derives most of its revenue through collecting information through advertising keywords on its internet searches. Governments use them to gather and provide information and services to their citizens. Apart from this, digital goods- eBooks, video products, tools and software, and gaming social networks use them to generate sales for their products. Individuals use them for shopping, banking, entertainment, etc.

The Anatomy of Online Form Attacks

Online form attacks are caused when malicious elements exploit vulnerabilities and steal sensitive information or perform malicious activities. The attacks can target different applications of the forms. It is, therefore, important for organizations to understand the anatomy of online form attacks to keep them and their users protected from potential threats. Here are 3 key components in such attacks.

1. CSRF (Cross-Site Request Forgery)

CSRF is an attack on the web security of a form where the attacker tricks the user into performing unwanted actions that the user has not authenticated. This will result in data loss, changes in the user account, and other malicious actions.

This is how a CSRF attack will typically work

  • Authentication and request – The victim is already authenticated to a web application through a login session. The attacker will send a malicious request, which may include an HTTP parameter and a URL containing certain actions on the target website application. For example, you could be requested to change the user password, delete data, etc.
  • Trick – The attacker will trick the victim into clicking on a link or web page that will make an unintended request for a target online form. 
  • Unintended action – Once the command is accepted by the form, the attacker will get access to your information.

2. Data Scraping

In data scraping, attackers make use of bots to scrape through the information from your online forms. According to a report by the Automated Fraud Benchmark Report, data scraping has increased by 102%, in the past few years.

Attackers may use this opportunity to copy your content and usurp its search engine ranking to duplicate its look and branding for fraudulent purposes. They can easily create phishing forms and fake advertisement campaigns to trick users into entering their personal information.

3. Phishing

Phishing is a cyberattack on online forms where attackers trick individuals into divulging sensitive information. The attacks involve deceptive tactics, where an attacker can create fake forms that are nearly identical to your form and manipulate victims to take specific information.

A phishing attack starts with deceptive emails, phone calls, or text messages which may seem like they are coming from trusted sources. They may also create a sense of urgency or fear, claiming a security breach or an offer that is too good to miss.

The attacks are continuously evolving, and it is important to employ good cybersecurity to keep your online form safe and secure. Let us look at them below.

Foundational Security Measures

Implementing foundational security measures is important to set a base to protect your sensitive data and prevent malicious activities. Here are some security measures you need to consider.

1. Data Encryption

Data encryption helps protect your data during rest and transit. This will keep the confidentiality and integrity of sensitive information safe, making it challenging for unauthorized individuals or malicious elements.

At rest, data encryption revolves around securing data when it is stored in physical or digital storage media, like databases or backups. Even if an attacker gains physical access to the storage, they won’t be able to decipher the sensitive information.

Data encryption during transit will protect your information between the user’s device and the server. This will prevent the interception of sensitive information during transmission. So you can be sure that the data received at the destination is the same as when it is sent. Any tampering of the data will result in decryption errors and will alert the recipient of any issues.

To implement strong data encryption algorithms, you can follow the steps.

  • Understand your requirement
  • Select appropriate encryption algorithms (common choices are AES, RSA, and ECC).
  • Implement strong key management and secure the exchange key.
  • Combine encryption with strong authentication and authorization.
  • Use encryption algorithms to provide data integrity checks and use random number generation code.
  • Regularly update and paste the codes.
  • Thoroughly test and validate the offering.
  • Comply with industry-specific standards and ensure proper data backup and recovery.
  • Implement logging and monitoring mechanisms.
  • Allow secure disposal and maintain detailed documentation of your encryption.

2. Secure Tokens

Security tokens for forms help enhance the security of your web forms to prevent cross-site request forgery attacks. These tokens help keep your online and digital transactions protected and safe. They are utilized to identify a user’s identity, grant access to certain resources, and authorize said action. Secure tokens come in several forms with their own level of security.

3. Data Masking

Data masking for online forms is a privacy technique that helps mask the sensitive information entered by a user in the web-based form. The primary goal is to hide data portions like passwords to prevent unauthorized access to sensitive information.

Intermediate Security Strategies

Intermediate security strategies implement practices and measures that are beyond basic security measures. They are not as comprehensive or complex as advanced security strategies. Here are popular intermediate security strategies you have to consider.

1. Content Security Policy (CSP)

A Content Security Policy is a layer of security that is built into all modern browsers. The feature helps you recognize and mitigate risks like XSS and data injection attacks. The security policy whitelists the URLs by specifying a value that has to be in the tag that will load the script.

2. Secure Cookies

Secure cookies are pivotal for protecting your user data and privacy.  Essentially, cookies are small pieces of data that a website will send to a user’s web browser, which are stored on the user’s device.

A safe cookie is only transmitted over an encrypted HTTPS connection to prevent sensitive data from being sent over unsecured connections. If a cookie is marked as HttpOnly, it cannot be accessed by the JavaScript running on the client side. This helps prevent XXS, where attackers inject malicious scripts.

3. Input Sanitization

It is a crucial security practice to protect against malicious input, SQL injection, XXS attacks, etc. The primary goal of input sanitization is to ensure that the data provided by the user or any external source is clean and safe from harmful content before it can be processed or stored.

Advanced Techniques for Form Security

Advanced security techniques for online forms is the highest level of security to protect your information. Below are three advanced techniques for optimum performance.

1. Behavioral Biometrics

Behavioral biometrics is an advanced security technique to protect forms against malware. It focuses on identifying individuals based on behavioral patterns like typing speed, mouse movements, etc. These patterns are unique to each individual and help authenticate who is using, inputting, or making any alterations to the form.

Behavioral biometrics is being used increasingly in every industry from government facilities and financial services for authentication to educational institutions for correspondence or online courses as a mode of study and examination.

2. AI and Machine Learning

AI algorithms allow users to analyze the behavior of the online form to detect any malware variants. Any abnormal patterns or malicious activities are flagged with machine learning techniques. It helps analyze larger datasets to identify any deviations from normal behavior.

3. API Security

API security is another powerful feature that is essential to protect the integrity and availability of all data and services that are exposed through APIs. They work as a framework in the backend for mobile and web applications.

Compliance and Regulations

Data compliance and regulations exist in different countries and regions across the world. These regulations help protect the personal data of individuals, protect your privacy rights, and impose obligations on organizations that will process the data. Some of the prominent data protection regulations are

  • GDPR – It is a comprehensive data protection regulation in the EU and EEA. It offers individuals greater control over their personal data.
  • CCPA – It is a data protection law in California, USA. It gives users rights over their personal information.
  • Other relevant data protection regulations are LGPD, PDPA, PIPEDA, HIPAA, and APEC Privacy Framework.

Compliance with data protection can have a significant impact on your form security. Failure to comply with them can result in legal consequences or damage. So, try and comply with these rules to ensure your online form is safe from malware or attackers.

Best Practices and Checklists

In the article so far, we’ve listed some of the best ways you can protect your data from being attacked by malware or hackers. Here is a list of security changes you can make right now to protect your online form

  • Implement and validate a sitewide SSL to protect your data from tampering or scammers and also improve search engine rankings.
  • Create a 2-factor authentication or SHA256 encryption for your passwords.
  • Enforce communication strictly through HTTP.
  • Select a trustworthy hosting provider if you already don’t have one.
  • Guarantee input validation in the forms for optimal security.

Performing periodic security audits is very important to identify the organization’s overall cybersecurity strategy. These audits make sure that your business is always updated against bugs and security gaps. You don’t have to take the back seat when it comes to the security of your online forms. Move forward and perform a security check before the problem escalates and becomes an issue, saving you financial and reputational losses.

Image by FLY:D on Unsplash

Conclusion

The security of online forms is essential to protect your sensitive data, maintain user trust, and comply with different regulations. Neglecting the security of your online forms can lead to leakage of sensitive information and reputation loss. However, security is not a one-time thing, and you have to constantly audit your security to stay ahead of any new issues or malware.

Featured Image by Franck on Unsplash

The post Guarding the Gateway: How to Protect Your Online Forms from Security Risks appeared first on noupe.

Categories: Others Tags:

20 Best New Websites, October 2023

October 9th, 2023 No comments

Looking for inspiration? Well, look no further: here is our round up of what’s caught our eye for October.

Categories: Designing, Others Tags:

How to Make TikTok Ads

October 9th, 2023 No comments

In today’s fast-paced digital world, TikTok has emerged as a powerhouse in the realm of social media marketing. With its rapidly growing user base and engaging content, TikTok offers a unique opportunity for businesses to showcase their products and services through TikTok ads. In this comprehensive guide, we will walk you through everything you need to know to create outstanding TikTok ads that captivate your audience and boost your brand’s visibility.

What are TikTok Ads?

TikTok ads are a form of paid advertising on the TikTok platform. They allow businesses and brands to promote their products, services, or campaigns to a vast and diverse audience of users. TikTok offers several ad formats that cater to different marketing goals, ensuring that there’s an option for every business. These ads appear seamlessly in users’ feeds, making them an integral part of the TikTok experience.

Types of TikTok Ads

Photo by cottonbro studio on Pexels

To create a successful TikTok marketing strategy, it’s essential to understand the various ad formats available. Here are the primary types of TikTok ads:

1. In-Feed Ads

In-feed ads are short video ads that appear in users’ feeds as they scroll through the app. These ads are skippable and can be up to 60 seconds long. They are a fantastic option for increasing brand awareness and engagement.

2. Branded Hashtag Challenges

Branded hashtag challenges encourage users to create content related to your brand or campaign. These challenges often go viral, amplifying your reach. They can include a banner on the Discover page to drive participation.

3. Branded Effects

Branded effects involve creating custom filters and effects that users can use in their videos. This interactive approach increases user engagement with your brand.

4. TopView Ads

TopView ads are the first thing users see when they open the TikTok app. These are 60-second videos that grab the user’s attention and can lead to higher click-through rates.

5. Branded AR Content

Augmented reality (AR) ads allow users to interact with your product in a virtual environment. These ads can be highly immersive and drive user engagement.

How Much Do TikTok Ads Cost?

Image by katemangostar on Freepik

TikTok ads’ cost can vary widely based on factors like your target audience, ad format, and campaign objectives. On average, businesses can expect to pay between $10 and $300 per 1000 views (CPM) for in-feed ads. Branded hashtag challenges may cost anywhere from $50,000 to $150,000, depending on the level of promotion you require. Remember that TikTok allows you to set a daily or lifetime budget to control your spending.

TikTok Ad Specs

Each type of TikTok ad has specific requirements to ensure your content displays correctly and effectively. Here are the general ad specifications you need to keep in mind:

  • Aspect Ratio: 9:16 is the recommended aspect ratio for TikTok ads.
  • Video Length: Most TikTok ads should be between 15 to 60 seconds in length.
  • File Format: Use MP4 or MOV video file formats.
  • Resolution: A minimum resolution of 720p is recommended for high-quality visuals.
  • File Size: Keep your video file size below 500MB.
  • Sound: Ensure your ad works both with and without sound, as many users watch videos on mute.
  • Captions: Include clear and concise captions for accessibility.

How to Set Up a TikTok Ad Campaign

Creating a TikTok ad campaign involves several steps:

1. Create a TikTok Ads Account

  • Go to TikTok Ads Manager and sign up for an account.
  • Verify your email address and complete your profile.

2. Select Your Campaign Objective

  • Choose the primary goal of your campaign, such as website clicks, app installations, or video views.

3. Define Your Target Audience

  • Specify the demographics, interests, and behaviors of your target audience to reach the right users.

4. Set Your Budget and Schedule

  • Determine your daily or lifetime budget and choose your campaign start and end dates.

5. Choose Ad Format

  • Select the most suitable ad format for your campaign goals.

6. Create Ad Creative

  • Develop compelling video content that aligns with your chosen ad format and campaign objectives.

7. Launch Your Campaign

  • Review your campaign settings and creative, then launch your TikTok ad campaign.

8. Monitor and Optimize

  • Continuously monitor your campaign’s performance and make adjustments to improve results.

5 TikTok Ads Examples

To inspire your TikTok ad creation, let’s take a look at five standout TikTok ad examples:

1. Fenty Beauty’s In-Feed Ad

  • Fenty Beauty’s in-feed ad showcased their makeup products with a catchy soundtrack, capturing the essence of their brand.

2. Guess’s Branded Hashtag Challenge

  • Guess encouraged users to participate in a branded challenge, driving user-generated content and engagement.

3. NBA’s Branded AR Content

  • The NBA used augmented reality to let users virtually dunk a basketball, creating an immersive ad experience.

4. GrubHub’s TopView Ad

  • GrubHub’s TopView ad presented mouth-watering food visuals to promote their food delivery service.

5. Pepsi’s Branded Effects

  • Pepsi created custom filters that turned users into dancing emojis, adding a fun and interactive element to their ad campaign.

TikTok Advertising Best Practices

To make your TikTok ads truly great, follow these best practices:

  • Keep it Short and Sweet: TikTok users have short attention spans, so make your content engaging from the start.
  • Use Popular Music: Incorporate trending songs to increase the chances of your ad going viral.
  • User-Generated Content: Encourage user-generated content through challenges and contests.
  • Tell a Story: Craft a compelling narrative or showcase a unique aspect of your product.
  • Optimize for Mobile: Ensure your ad looks and works well on mobile devices.
  • A/B Testing: Experiment with different ad creatives to discover what resonates best with your audience.
  • Engage with Comments: Respond to user comments to foster a sense of community and trust.

Conclusion

TikTok ads are a dynamic and effective way to promote your brand to a vast and engaged audience. By understanding the various ad formats, following best practices, and continuously optimizing your campaigns, you can create great TikTok ads that resonate with users and drive business growth in 2023 and beyond. So, seize the opportunity and let your creativity shine on TikTok!

Featured image by Alexander Shatov on Unsplash

The post How to Make TikTok Ads appeared first on noupe.

Categories: Others Tags:

Gatsby Headaches: Working With Media (Part 1)

October 9th, 2023 No comments

Working with media files in Gatsby might not be as straightforward as expected. I remember starting my first Gatsby project. After consulting Gatsby’s documentation, I discovered I needed to use the gatsby-source-filesystem plugin to make queries for local files. Easy enough!

That’s where things started getting complicated. Need to use images? Check the docs and install one — or more! — of the many, many plugins available for handling images. How about working with SVG files? There is another plugin for that. Video files? You get the idea.

It’s all great until any of those plugins or packages become outdated and go unmaintained. That’s where the headaches start.

If you are unfamiliar with Gatsby, it’s a React-based static site generator that uses GraphQL to pull structured data from various sources and uses webpack to bundle a project so it can then be deployed and served as static files. It’s essentially a static site generator with reactivity that can pull data from a vast array of sources.

Like many static site frameworks in the Jamstack, Gatsby has traditionally enjoyed a great reputation as a performant framework, although it has taken a hit in recent years. Based on what I’ve seen, however, it’s not so much that the framework is fast or slow but how the framework is configured to handle many of the sorts of things that impact performance, including media files.

So, let’s solve the headaches you might encounter when working with media files in a Gatsby project. This article is the first of a brief two-part series where we will look specifically at the media you are most likely to use: images, video, and audio. After that, the second part of this series will get into different types of files, including Markdown, PDFs, and even 3D models.

Solving Image Headaches In Gatsby

I think that the process of optimizing images can fall into four different buckets:

  1. Optimize image files.
    Minimizing an image’s file size without losing quality directly leads to shorter fetching times. This can be done manually or during a build process. It’s also possible to use a service, like Cloudinary, to handle the work on demand.
  2. Prioritize images that are part of the First Contentful Paint (FCP).
    FCP is a metric that measures the time between the point when a page starts loading to when the first bytes of content are rendered. The idea is that fetching assets that are part of that initial render earlier results in faster loading rather than waiting for other assets lower on the chain.
  3. Lazy loading other images.
    We can prevent the rest of the images from render-blocking other assets using the loading="lazy" attribute on images.
  4. Load the right image file for the right context.
    With responsive images, we can serve one version of an image file at one screen size and serve another image at a different screen size with the srcset and sizes attributes or with the element.

These are great principles for any website, not only those built with Gatsby. But how we build them into a Gatsby-powered site can be confusing, which is why I’m writing this article and perhaps why you’re reading it.

Lazy Loading Images In Gatsby

We can apply an image to a React component in a Gatsby site like this:

import * as React from "react";

import forest from "./assets/images/forest.jpg";

const ImageHTML = () => {
  return <img src={ forest } alt="Forest trail" />;
};

It’s important to import the image as a JavaScript module. This lets webpack know to bundle the image and generate a path to its location in the public folder.

This works fine, but when are we ever working with only one image? What if we want to make an image gallery that contains 100 images? If we try to load that many tags at once, they will certainly slow things down and could affect the FCP. That’s where the third principle that uses the loading="lazy" attribute can come into play.

import * as React from "react";

import forest from "./assets/images/forest.jpg";

const LazyImageHTML = () => {
  return <img src={ forest } loading="lazy" alt="Forest trail" />;
};

We can do the opposite with loading="eager". It instructs the browser to load the image as soon as possible, regardless of whether it is onscreen or not.

import * as React from "react";

import forest from "./assets/images/forest.jpg";

const EagerImageHTML = () => {
  return <img src={ forest } loading="eager" alt="Forest trail" />;
};

Implementing Responsive Images In Gatsby

This is a basic example of the HTML for responsive images:

<img
  srcset="./assets/images/forest-400.jpg 400w, ./assets/images/forest-800.jpg 800w"
  sizes="(max-width: 500px) 400px, 800px"
  alt="Forest trail"
/>

In Gatsby, we must import the images first and pass them to the srcset attribute as template literals so webpack can bundle them:

import * as React from "react";

import forest800 from "./assets/images/forest-800.jpg";

import forest400 from "./assets/images/forest-400.jpg";

const ResponsiveImageHTML = () => {
  return (
    <img
      srcSet={`

        ${ forest400 } 400w,

        ${ forest800 } 800w

      `}
      sizes="(max-width: 500px) 400px, 800px"
      alt="Forest trail"
    />
  );
};

That should take care of any responsive image headaches in the future.

Loading Background Images In Gatsby

What about pulling in the URL for an image file to use on the CSS background-url property? That looks something like this:

import * as React from "react";

import "./style.css";

const ImageBackground = () => {
  return <div className="banner"></div>;
};
/* style.css */

.banner {
      aspect-ratio: 16/9;
      background-size: cover;

    background-image: url("./assets/images/forest-800.jpg");

  /* etc. */
}

This is straightforward, but there is still room for optimization! For example, we can do the CSS version of responsive images, which loads the version we want at specific breakpoints.

/* style.css */

@media (max-width: 500px) {
  .banner {
    background-image: url("./assets/images/forest-400.jpg");
  }
}

Using The gatsby-source-filesystem Plugin

Before going any further, I think it is worth installing the gatsby-source-filesystem plugin. It’s an essential part of any Gatsby project because it allows us to query data from various directories in the local filesystem, making it simpler to fetch assets, like a folder of optimized images.

npm i gatsby-source-filesystem

We can add it to our gatsby-config.js file and specify the directory from which we will query our media assets:

// gatsby-config.js

module.exports = {
  plugins: [
    {
      resolve: `gatsby-source-filesystem`,

      options: {
        name: `assets`,

        path: `${ __dirname }/src/assets`,
      },
    },
  ],
};

Remember to restart your development server to see changes from the gatsby-config.js file.

Now that we have gatsby-source-filesystem installed, we can continue solving a few other image-related headaches. For example, the next plugin we look at is capable of simplifying the cures we used for lazy loading and responsive images.

Using The gatsby-plugin-image Plugin

The gatsby-plugin-image plugin (not to be confused with the outdated gatsby-image plugin) uses techniques that automatically handle various aspects of image optimization, such as lazy loading, responsive sizing, and even generating optimized image formats for modern browsers.

Once installed, we can replace standard tags with either the or components, depending on the use case. These components take advantage of the plugin’s features and use the HTML element to ensure the most appropriate image is served to each user based on their device and network conditions.

We can start by installing gatsby-plugin-image and the other plugins it depends on:

npm install gatsby-plugin-image gatsby-plugin-sharp gatsby-transformer-sharp

Let’s add them to the gatsby-config.js file:

// gatsby-config.js

module.exports = {
plugins: [

// other plugins
`gatsby-plugin-image`,
`gatsby-plugin-sharp`,
`gatsby-transformer-sharp`],

};

This provides us with some features we will put to use a bit later.

Using The StaticImage Component

The StaticImage component serves images that don’t require dynamic sourcing or complex transformations. It’s particularly useful for scenarios where you have a fixed image source that doesn’t change based on user interactions or content updates, like logos, icons, or other static images that remain consistent.

The main attributes we will take into consideration are:

  • src: This attribute is required and should be set to the path of the image you want to display.
  • alt: Provides alternative text for the image.
  • placeholder: This attribute can be set to either blurred or dominantColor to define the type of placeholder to display while the image is loading.
  • layout: This defines how the image should be displayed. It can be set to fixed for, as you might imagine, images with a fixed size, fullWidth for images that span the entire container, and constrained for images scaled down to fit their container.
  • loading: This determines when the image should start loading while also supporting the eager and lazy options.

Using StaticImage is similar to using a regular HTML tag. However, StaticImage requires passing the string directly to the src attribute so it can be bundled by webpack.

import * as React from "react";

import { StaticImage } from "gatsby-plugin-image";

const ImageStaticGatsby = () => {
  return (
    <StaticImage
      src="./assets/images/forest.jpg"
      placeholder="blurred"
      layout="constrained"
      alt="Forest trail"
      loading="lazy"
    />
  );
  };

The StaticImage component is great, but you have to take its constraints into account:

  • No Dynamically Loading URLs
    One of the most significant limitations is that the StaticImage component doesn’t support dynamically loading images based on URLs fetched from data sources or APIs.
  • Compile-Time Image Handling
    The StaticImage component’s image handling occurs at compile time. This means that the images you specify are processed and optimized when the Gatsby site is built. Consequently, if you have images that need to change frequently based on user interactions or updates, the static nature of this component might not fit your needs.
  • Limited Transformation Options
    Unlike the more versatile GatsbyImage component, the StaticImage component provides fewer transformation options, e.g., there is no way to apply complex transformations like cropping, resizing, or adjusting image quality directly within the component. You may want to consider alternative solutions if you require advanced transformations.

Using The GatsbyImage Component

The GatsbyImage component is a more versatile solution that addresses the limitations of the StaticImage component. It’s particularly useful for scenarios involving dynamic image loading, complex transformations, and advanced customization.

Some ideal use cases where GatsbyImage is particularly useful include:

  • Dynamic Image Loading
    If you need to load images dynamically based on data from APIs, content management systems, or other sources, the GatsbyImage component is the go-to choice. It can fetch images and optimize their loading behavior.
  • Complex transformations
    The GatsbyImage component is well-suited for advanced transformations, using GraphQL queries to apply them.
  • Responsive images
    For responsive design, the GatsbyImage component excels by automatically generating multiple sizes and formats of an image, ensuring that users receive an appropriate image based on their device and network conditions.

Unlike the StaticImage component, which uses a src attribute, GatsbyImage has an image attribute that takes a gatsbyImageData object. gatsbyImageData contains the image information and can be queried from GraphQL using the following query.

query {
  file(name: { eq: "forest" }) {
    childImageSharp {
      gatsbyImageData(width: 800, placeholder: BLURRED, layout: CONSTRAINED)
    }

    name
  }
}

If you’re following along, you can look around your Gatsby data layer at http://localhost:8000/___graphql.

From here, we can use the useStaticQuery hook and the graphql tag to fetch data from the data layer:

import * as React from "react";

import { useStaticQuery, graphql } from "gatsby";

import { GatsbyImage, getImage } from "gatsby-plugin-image";

const ImageGatsby = () => {
  // Query data here:

  const data = useStaticQue(graphql``);

  return <div></div>;
};

Next, we can write the GraphQL query inside of the graphql tag:

import * as React from "react";

import { useStaticQuery, graphql } from "gatsby";

const ImageGatsby = () => {
  const data = useStaticQuery(graphqlquery {
      file(name: { eq: "forest" }) {
        childImageSharp {
          gatsbyImageData(width: 800, placeholder: BLURRED, layout: CONSTRAINED)
        }

        name
      }
    });

  return <div></div>;
};

Next, we import the GatsbyImage component from gatsby-plugin-image and assign the image’s gatsbyImageData property to the image attribute:

import * as React from "react";

import { useStaticQuery, graphql } from "gatsby";

import { GatsbyImage } from "gatsby-plugin-image";

const ImageGatsby = () => {
  const data = useStaticQuery(graphqlquery {
      file(name: { eq: "forest" }) {
        childImageSharp {
          gatsbyImageData(width: 800, placeholder: BLURRED, layout: CONSTRAINED)
        }

        name
      }
    });

  return <GatsbyImage image={ data.file.childImageSharp.gatsbyImageData } alt={ data.file.name } />;
};

Now, we can use the getImage helper function to make the code easier to read. When given a File object, the function returns the file.childImageSharp.gatsbyImageData property, which can be passed directly to the GatsbyImage component.

import * as React from "react";

import { useStaticQuery, graphql } from "gatsby";

import { GatsbyImage, getImage } from "gatsby-plugin-image";

const ImageGatsby = () => {
  const data = useStaticQuery(graphqlquery {
      file(name: { eq: "forest" }) {
        childImageSharp {
          gatsbyImageData(width: 800, placeholder: BLURRED, layout: CONSTRAINED)
        }

        name
      }
    });

  const image = getImage(data.file);

  return <GatsbyImage image={ image } alt={ data.file.name } />;
};

Using The gatsby-background-image Plugin

Another plugin we could use to take advantage of Gatsby’s image optimization capabilities is the gatsby-background-image plugin. However, I do not recommend using this plugin since it is outdated and prone to compatibility issues. Instead, Gatsby suggests using gatsby-plugin-image when working with the latest Gatsby version 3 and above.

If this compatibility doesn’t represent a significant problem for your project, you can refer to the plugin’s documentation for specific instructions and use it in place of the CSS background-url usage I described earlier.

Solving Video And Audio Headaches In Gatsby

Working with videos and audio can be a bit of a mess in Gatsby since it lacks plugins for sourcing and optimizing these types of files. In fact, Gatsby’s documentation doesn’t name or recommend any official plugins we can turn to.

That means we will have to use vanilla methods for videos and audio in Gatsby.

Using The HTML video Element

The HTML video element is capable of serving different versions of the same video using the tag, much like the img element uses the srset attribute to do the same for responsive images.

That allows us to not only serve a more performant video format but also to provide a fallback video for older browsers that may not support the bleeding edge:

import * as React from "react";

import natureMP4 from "./assets/videos/nature.mp4";

import natureWEBM from "./assets/videos/nature.webm";

const VideoHTML = () => {
  return (
    <video controls>
      <source src={ natureMP4 } type="video/mp4" />

      <source src={ natureWEBM } type="video/webm" />
    </video>
  );
};

P;

We can also apply lazy loading to videos like we do for images. While videos do not support the loading="lazy" attribute, there is a preload attribute that is similar in nature. When set to none, the attribute instructs the browser to load a video and its metadata only when the user interacts with it. In other words, it’s lazy-loaded until the user taps or clicks the video.

We can also set the attribute to metadata if we want the video’s details, such as its duration and file size, fetched right away.

<video controls preload="none">
  <source src={ natureMP4 } type="video/mp4" />

  <source src={ natureWEBM } type="video/webm" />
</video>

Note: I personally do not recommend using the autoplay attribute since it is disruptive and disregards the preload attribute, causing the video to load right away.

And, like images, display a placeholder image for a video while it is loading with the poster attribute pointing to an image file.

<video controls preload="none" poster={ forest }>
  <source src={ natureMP4 } type="video/mp4" />

  <source src={ natureWEBM } type="video/webm" />
</video>

Using The HTML audio Element

The audio and video elements behave similarly, so adding an audio element in Gatsby looks nearly identical, aside from the element:

import * as React from "react";

import audioSampleMP3 from "./assets/audio/sample.mp3";

import audioSampleWAV from "./assets/audio/sample.wav";

const AudioHTML = () => {
  return (
    <audio controls>
      <source src={ audioSampleMP3 } type="audio/mp3" />

      <source src={ audioSampleWAV } type="audio/wav" />
    </audio>
  );
};

As you might expect, the audio element also supports the preload attribute:

<audio controls preload="none">
  <source src={ audioSampleMP3 } type="audio/mp3" />

  <source src={a udioSampleWAV } type="audio/wav" />
</audio>

This is probably as good as we can do to use videos and images in Gatsby with performance in mind, aside from saving and compressing the files as best we can before serving them.

Solving iFrame Headaches In Gatsby

Speaking of video, what about ones embedded in an like we might do with a video from YouTube, Vimeo, or some other third party? Those can certainly lead to performance headaches, but it’s not as we have direct control over the video file and where it is served.

Not all is lost because the HTML iframe element supports lazy loading the same way that images do.

import * as React from "react";

const VideoIframe = () => {
  return (
    <iframe
      src="https://www.youtube.com/embed/jNQXAC9IVRw"
      title="Me at the Zoo"
      allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
      allowFullScreen
      loading="lazy"
    />
  );
};

Embedding a third-party video player via iframe can possibly be an easier path than using the HTML video element. iframe elements are cross-platform compatible and could reduce hosting demands if you are working with heavy video files on your own server.

That said, an iframe is essentially a sandbox serving a page from an outside source. They’re not weightless, and we have no control over the code they contain. There are also GDPR considerations when it comes to services (such as YouTube) due to cookies, data privacy, and third-party ads.

Solving SVG Headaches In Gatsby

SVGs contribute to improved page performance in several ways. Their vector nature results in a much smaller file size compared to raster images, and they can be scaled up without compromising quality. And SVGs can be compressed with GZIP, further reducing file sizes.

That said, there are several ways that we can use SVG files. Let’s tackle each one in the contact of Gatsby.

Using Inline SVG

SVGs are essentially lines of code that describe shapes and paths, making them lightweight and highly customizable. Due to their XML-based structure, SVG images can be directly embedded within the HTML tag.

import * as React from "react";



const SVGInline = () => {

  return (

    <svg viewBox="0 0 24 24" fill="#000000">

      <!-- etc. -->

    </svg>

  );

};

Just remember to change certain SVG attributes, such as xmlns:xlink or xlink:href, to JSX attribute spelling, like xmlnsXlink and xlinkHref, respectively.

Using SVG In img Elements

An SVG file can be passed into an img element’s src attribute like any other image file.

import * as React from "react";

import picture from "./assets/svg/picture.svg";

const SVGinImg = () => {
  return <img src={ picture } alt="Picture" />;
};

Loading SVGs inline or as HTML images are the de facto approaches, but there are React and Gatsby plugins capable of simplifying the process, so let’s look at those next.

Inlining SVG With The react-svg Plugin

react-svg provides an efficient way to render SVG images as React components by swapping a ReactSVG component in the DOM with an inline SVG.

Once installing the plugin, import the ReactSVG component and assign the SVG file to the component’s src attribute:

import * as React from "react";

import { ReactSVG } from "react-svg";

import camera from "./assets/svg/camera.svg";

const SVGReact = () => {
  return <ReactSVG src={ camera } />;
};

Using The gatsby-plugin-react-svg Plugin

The gatsby-plugin-react-svg plugin adds svg-react-loader to your Gatsby project’s webpack configuration. The plugin adds a loader to support using SVG files as React components while bundling them as inline SVG.

Once the plugin is installed, add it to the gatsby-config.js file. From there, add a webpack rule inside the plugin configuration to only load SVG files ending with a certain filename, making it easy to split inline SVGs from other assets:

// gatsby-config.js

module.exports = {
  plugins: [
    {
      resolve: "gatsby-plugin-react-svg",

      options: {
        rule: {
          include: /.inline.svg$/,
        },
      },
    },
  ],
};

Now we can import SVG files like any other React component:

import * as React from "react";

import Book from "./assets/svg/book.inline.svg";

const GatsbyPluginReactSVG = () => {
  return <Book />;
};

And just like that, we can use SVGs in our Gatsby pages in several different ways!

Conclusion

Even though I personally love Gatsby, working with media files has given me more than a few headaches.

As a final tip, when needing common features such as images or querying from your local filesystem, go ahead and install the necessary plugins. But when you need a minor feature, try doing it yourself with the methods that are already available to you!

If you have experienced different headaches when working with media in Gatsby or have circumvented them with different approaches than what I’ve covered, please share them! This is a big space, and it’s always helpful to see how others approach similar challenges.

Again, this article is the first of a brief two-part series on curing headaches when working with media files in a Gatsby project. The following article will be about avoiding headaches when working with different media files, including Markdown, PDFs, and 3D models.

Further Reading

Categories: Others Tags:

Re-Creating The Pop-Out Hover Effect With Modern CSS (Part 2)

October 5th, 2023 No comments

The last time we met, I demonstrated how newer CSS features — particularly trigonometric functions — can be leveraged to accomplish a “pop-out” hover effect. This is what we made together:

Even the rotation is possible with clip-path polygon():

We can define the shape with three parameters:

  • The number of spikes (we’ll call this N);
  • The radius of the big circle, illustrated in green (we’ll call this R);
  • The radius of the small circle illustrated in blue (this will be R - d).

For the sake of simplicity, I will define d as a percentage of RR - (R * p) — where p is a number in the range [0 1]. So, in the end, we are left with three variables, N, R, and p.

If you look closely at the shape, you can see it is a series of triangular shapes that are cut out of a large circular shape. That is exactly how we are going to tackle this challenge. We can create triangles with conic-gradient and then cut them out of the circle with the mask-composite property. Getting a circle is pretty easy using border-radius: 50%.

The number of conic gradients is equal to the number of triangles in the pattern. Each gradient can use nearly the same configuration, where the difference between them is how they are rotated. That means the gradient’s code will look something like this:

conic-gradient(from -1*angle at {position}, #000 2*angle, #0000 0);

Thankfully, the position we calculated in the last article is similar enough to the point that we can rely on it here as well:

50% + (50% * (1 - p)) * cos(360deg * i/N)
50% + (50% * (1 - p)) * sin(360deg * i/N)

Again, N is the number of triangles, and p controls the radius of the small circle. R is equal to 50%, so the position can also be expressed like this:

R + (R * (1 - p)) * cos(360deg * i/N)
R + (R * (1 - p)) * sin(360deg * i/N)

We need to resort to some geometry to determine the value of angle. I will skip the boring math for the sake of brevity, but please feel free to leave a comment if you’re interested in the formula, and I will be glad to give you more details.

angle = atan(sin(180deg/N)/(p - 1 + cos(180deg/N)))

Now, we need to loop through all of that as many times as there are triangles in the pattern. So, we will do what we did in the last article and switch from vanilla CSS to Sass so we can take advantage of Sass loops.

The following snippet selects the one element in the HTML, , and loops through the conic gradients for as many triangles we set ($n: 9). The output of that loop is saved as another variable, $m, that is applied to the CSS mask.

$n: 9;  /* number of spikes */

img {
--r: 160px; /* radius */ --p: 0.25; /* percent */ --angle: atan(sin(180deg/#{$n}) / (var(--p) - 1 + cos(180deg/#{$n}))); width: calc(2 * var(--r)); aspect-ratio: 1; border-radius: 50%; $m: (); @for $i from 0 through ($n - 1) { $m: append($m, conic-gradient( from calc(90deg + 360deg * #{$i/$n} - var(--angle)) at
calc(50% + (50% * (1 - var(--p))) v cos(360deg * #{$i/$n})) calc(50% + (50% * (1 - var(--p))) * sin(360deg * #{$i/$n})), #000 calc(2*var(--angle)), #0000 0), comma ); } mask: $m; }

Here’s the result of all that work:

Next, we add the scale effect to the image’s :hover state:

img {
  --f: 1.2; /* the scale factor */
  /* etc */
}
img:hover {
  scale: var(--f);
}

To make sure both starburst shapes have identical sizes (in the non-hover and hover states), --i needs a formula based on the scale factor:

img {
  --f: 1.2; /* the scale factor */
  /* etc */
}
img:hover {
  --i: calc(var(--r) * (1 - var(--p)) * (var(--f) - 1) / var(--f));
  scale: var(--f);
}

And, now, we are finally finished.

See the Pen Fancy Pop Out hover effect! by Temani Afif.

Another Example

Let’s try another fancy effect where the avatar is hidden, and on hover, it slides from the bottom to “pop out” while, at the same time, we update the starburst shape.

See the Pen Fancy Pop Out Reveal hover effect! by Temani Afif.

Cool, right? We are still using only one element in the markup, but this time, I introduced the sliding effect. This will be your homework! I will let you dissect the code to understand what I have changed.

Hint: A CSS Tip where I am using the sliding effect.

Wrapping Up

I hope you enjoy having a little extra practice on the techniques we used in the previous article to create this “pop-out” hover effect. If it feels like I went a little faster this time around, it’s because I did. Rather than spending time explaining the same concepts and techniques, I was more concerned with demonstrating them in a slightly different context. So, we learned a few new ideas for working with gradients in CSS masks and background images!

In spite of the complexity of everything we covered, there is nothing that requires you to understand everything at once or even right away. Take the time to go through this and the previous article step-by-step until you grasp the parts that are toughest for you to grok. In all honesty, you will probably never find yourself in a situation where you need to use all these tricks together. This was a pretty niche exercise. But it provides us with an excuse to individually inspect the techniques that can help you solve some complex problems in CSS without resorting to scripting or extra HTML.

As for the math and the formulas, you don’t need to accurately understand them. The goal is to demonstrate that we can be as accurate as we want when it comes to calculating values and still develop something that is incredibly maintainable with only a few variables. Without trigonometric functions and calc() in CSS, we would be obliged to manually set all of the values once we need to update something, which would be incredibly tedious.

I’ll close this little series with a last demo. Enjoy!

See the Pen Pop out hover effect featuring Kevin and Alvaro by Temani Afif.

Categories: Others Tags: