Fortifying the Heart and Mind: Embracing Inner Strength

A dear friend shared this quote on Instagram and it made me go “WOW”! In a world where we are constantly surrounded by people and influenced by their thoughts and actions, it can be challenging to maintain our own sense of peace and contentment. However, the key to protecting our hearts and preserving our peace of mind lies in cultivating inner strength and resilience.

One of the primary steps towards safeguarding our hearts and minds is to recognize the distinction between external events and our internal responses. While we cannot control the actions of others, we have absolute control over our reactions. By acknowledging this fundamental truth, we free ourselves from the burden of carrying the emotional weight caused by external influences.

Developing emotional intelligence is paramount in maintaining inner peace. It involves understanding and managing our emotions effectively, allowing us to respond thoughtfully rather than react impulsively to external stimuli. When we learn to detach from negative emotions triggered by others, we can approach situations with a calm and composed demeanor.

A powerful tool in fortifying the heart and mind is the practice of self-compassion. Instead of being overly critical of ourselves for experiencing vulnerability or hurt, we should extend the same empathy and understanding we offer to others. Embracing self-compassion allows us to build emotional resilience, strengthening our hearts against the impact of external judgments or negativity.

Letting go of the need for external validation is a liberating step towards protecting our peace of mind. When we depend on others’ approval for our happiness, we inadvertently grant them the power to influence our emotional state. Embracing self-acceptance and recognizing our intrinsic worth help us build an unshakable foundation for our well-being.

Another vital aspect is learning to set and maintain healthy boundaries. Not everyone in our lives will have our best interests at heart, and it is crucial to protect ourselves from toxic or negative influences. By asserting our boundaries, we create a safe space that nurtures our inner peace and protects us from external harm.

Mindfulness practices offer a refuge from the hustle and bustle of the external world. Engaging in meditation, yoga, or simply taking moments of stillness enables us to reconnect with our inner selves, creating a shield against external pressures and disturbances.

Lastly, surrounding ourselves with positive, supportive, and like-minded individuals fosters an environment that nourishes our hearts and minds. Choosing our company wisely allows us to share our journey with people who understand and respect our values, uplifting us rather than draining our energy.


In conclusion, preserving our peace of mind and guarding our hearts is a continuous journey of self-awareness and inner growth. By recognizing that we have control over our reactions, developing emotional intelligence, practicing self-compassion, detaching from external validation, setting healthy boundaries, embracing mindfulness, and choosing our company wisely, we cultivate the inner strength necessary to remain unruffled amidst external influences. Let us embark on this empowering journey of self-discovery and fortification, and in doing so, we will discover a profound sense of peace that emanates from within.

Here are 26 things you can control!

Finding Joy in Celebrating Others

Life is an intricate journey, filled with a whole lot of experiences, both joyous and challenging. At times, we find ourselves confronted with personal struggles, burdens that weigh heavily on our hearts and minds. In these moments, it can be exceedingly difficult to witness the happiness and success of others. However, it is during these very moments of struggle that embracing the joy of others becomes an invaluable virtue, contributing to our own growth and well-being.

Being genuinely happy for others despite our hardships is a reflection of emotional maturity and empathy. It demonstrates an understanding that life’s challenges are not meant to be a competition of suffering. Instead, it serves as a reminder that everyone’s journey is unique, and each individual is bound to encounter their own obstacles and triumphs. Celebrating others’ happiness does not diminish our struggles but allows us to be part of their moments of joy, creating a sense of unity and shared positivity.

Moreover, when we embrace the happiness of others, we foster an atmosphere of support and compassion. As we extend genuine congratulations and encouragement, we inspire a ripple effect of kindness and goodwill. Our actions can be a beacon of hope for others, reminding them that happiness is attainable even amidst adversity. This fosters a sense of community and interconnectedness, where individuals can find solace in knowing they are not alone in their struggles and that their successes are worth celebrating.

Furthermore, celebrating others’ happiness can offer a much-needed perspective shift. While we may be going through challenging times, witnessing the joy of others can remind us of the beauty and potential life holds. It serves as a gentle nudge to focus on the positive aspects of our own journey and appreciate the small moments of happiness that may have gone unnoticed otherwise. By looking beyond our struggles and rejoicing in the happiness of others, we can find renewed hope and optimism for our own future.

Nonetheless, it is essential to acknowledge that embracing others’ happiness while facing personal struggles is not always easy. It requires a conscious effort to set aside envy, resentment, and comparison. Self-compassion plays a crucial role during this process, reminding us that it is okay to feel down or discouraged but encouraging us to rise above those emotions and share in the joy of others.

In conclusion, being happy for others in times of our own personal struggle is a powerful testament to our emotional maturity, empathy, and ability to find joy in interconnectedness. By celebrating the happiness of others, we cultivate an environment of support and compassion, inspiring hope and positivity in the face of our challenges. In doing so, we discover that happiness is not a limited resource but a boundless emotion that can be shared, magnified, and cherished by all. Let us embrace the happiness of others, even in the midst of our struggles, for it is through unity and kindness that we find the strength to navigate life’s unpredictable journey.


Here’s a lovely poem I came across by Shereen Bingham

You can feel happiness in others’ joy
even when you’re discouraged and alone,
forgotten in shadows of their glory, 
wobbly with disappointment of your own.

Comparing yourself is just as futile 
as comparing the mountains to the sea,
as measuring sun rays against moon beams
or assessing lady bugs in terms of bees.

Together we are present in nature
each with unique beauty and brilliance
that cannot be withered, dulled or subdued
by the others’ splendour or resilience

Build a Chatbot with Hugging Face and Gradio

Over the last few weeks, I have been reading up a lot on LLM stack. Tools such as LangChain, Aviary, Hugging Face. Over the weekend, I thought I’d explore creating a chatbot using Hugging Face and Gradio, two cutting-edge frameworks that simplify the development and deployment of conversational AI models.

I started out with building a simple chatbot using the Microsoft DialoGPT model, Hugging Face Space, and Gradio interference. I am sure you will be able to develop and customize your own one using a similar technique. So let’s get started!

First head over to https://huggingface.co/ and create a free account. After that, click on your display image on top right and select “New Space” option.

Fill out the form with App name, Licence, Space hardware, and visibility. 

Press “Create Space” to initialize the application. 

Next, on the space you just created, click on the “Files” tab > + Add file > Create a new file.  

First let’s create the requirements.txt file to add the required Python packages. You can add the following

transformers
torch

We will next create app.py which basically has the Gradio interface. 

I have loaded the “microsoft/DialoGPT-large” tokenizer and model and created a `predict` function for getting the response and creating the history.  You can take the full code for app.py below

from transformers import AutoModelForCausalLM, AutoTokenizer
import gradio as gr
import torch
​
​
title = "🤖AI ChatBot"
description = "A State-of-the-Art Large-scale Pretrained Response generation model (DialoGPT)"
examples = [["How are you?"]]
​
​
tokenizer = AutoTokenizer.from_pretrained("microsoft/DialoGPT-large")
model = AutoModelForCausalLM.from_pretrained("microsoft/DialoGPT-large")
​
​
def predict(input, history=[]):
    # tokenize the new input sentence
    new_user_input_ids = tokenizer.encode(
        input + tokenizer.eos_token, return_tensors="pt"
    )
​
    # append the new user input tokens to the chat history
    bot_input_ids = torch.cat([torch.LongTensor(history), new_user_input_ids], dim=-1)
​
    # generate a response
    history = model.generate(
        bot_input_ids, max_length=4000, pad_token_id=tokenizer.eos_token_id
    ).tolist()
​
    # convert the tokens to text, and then split the responses into lines
    response = tokenizer.decode(history[0]).split("<|endoftext|>")
    # print('decoded_response-->>'+str(response))
    response = [
        (response[i], response[i + 1]) for i in range(0, len(response) - 1, 2)
    ]  # convert to tuples of list
    # print('response-->>'+str(response))
    return response, history
​
​
gr.Interface(
    fn=predict,
    title=title,
    description=description,
    examples=examples,
    inputs=["text", "state"],
    outputs=["chatbot", "state"],
    theme="finlaymacklon/boxy_violet",
).launch()

I have provided my app with a customized theme: boxy violet. You can browse Gradio Theme Gallery to select the theme according to your taste. 

After this, your app will start building, and within a few minutes, it will download the model and load the model inference.

The Gradio App looks awesome. We just have to create a `predict` function for every different model architect to get responses and maintain history.

You can now chat and interact with the app on https://kenrickvaz-my-chatbot.hf.space

Hope you enjoyed building this simple chatbot along with me. You can check out hundreds of chatbots on Spaces for inspiration. And of course, please share your Gradio demo in the comment section!

Managing vs Leading

In the realm of organizational dynamics, managing people and leadership are two distinct yet interconnected concepts. While both involve influencing individuals and achieving collective goals, they differ in their approaches, perspectives, and overall impact on the team or organization.

Here are the key differences between the two

  1. Focus: Managing people revolves around operational efficiency, task completion, and maintaining organizational structure, while leadership emphasizes vision, inspiration, and strategic alignment.
  2. Authority vs. Influence: Managers often exercise authority based on their positional power, while leaders influence others through their personal qualities, expertise, and ability to connect with individuals on a deeper level.
  3. Transactional vs. Transformational: Managing people is often transactional, focusing on exchanges and meeting objectives, while leadership is transformational, aimed at inspiring growth, unleashing potential, and driving positive change.
  4. Short-term vs. Long-term: Managers are typically focused on short-term goals, immediate results, and operational effectiveness, while leaders have a long-term perspective, envisioning the future and guiding the organization towards sustainable success.
  5. Task vs. Relationship Orientation: Managing people is primarily task-oriented, with a focus on processes and outcomes, while leadership places equal emphasis on building strong relationships, fostering collaboration, and developing individuals.

A compelling example that illustrates the difference between managing people and leadership is the story of Steve Jobs, the co-founder and former CEO of Apple Inc. Jobs was widely recognized as a visionary leader who transformed multiple industries and revolutionized technology.

As a manager, Steve Jobs was known for his attention to detail, insistence on perfection, and ability to drive results. He had a keen eye for design and functionality, and he relentlessly pushed his teams to deliver products of exceptional quality. He was deeply involved in the day-to-day operations of Apple, overseeing every aspect of the company’s products and services. Jobs had a reputation for being demanding and challenging, setting high standards and expecting nothing less than excellence from his employees.

However, what truly set Steve Jobs apart was his leadership style. He was not just focused on managing the company; he had a clear vision and the ability to inspire others to share that vision. Jobs had an unwavering belief in the power of innovation and the impact technology could have on people’s lives. He had a remarkable ability to communicate his vision, captivating his audience with his charisma, passion, and storytelling skills.

Jobs empowered his team members to think creatively, take risks, and push boundaries. He encouraged a culture of collaboration and encouraged diverse perspectives, recognizing that breakthrough ideas often emerged from interdisciplinary teamwork. He challenged his employees to never settle for mediocrity. Jobs was not afraid to make bold decisions and was willing to go against conventional wisdom to pursue his vision.

Steve Jobs’ story exemplifies the difference between managing people and leadership. While Jobs exhibited strong managerial qualities, such as attention to detail and driving results, his true impact came from his exceptional leadership skills. He had a clear vision, inspired others to share that vision, and created a culture of innovation and excellence.

St. Thomas, The Apostle

On July 3, the Church celebrates the feast day of St. Thomas the Apostle. Best known for his initial unwillingness to believe the other apostles in their claim that Jesus had risen from the dead, St. Thomas can teach the faithful about believing without seeing.

Little is recorded of St. Thomas the Apostle. Thomas was probably born in Galilee to a humble family, but there is no indication that he was a fisherman. He was a Jew, but there is no account of how he became an apostle to Christ. Nevertheless, thanks to the fourth Gospel his personality is clearer to us than some of the other Twelve. Thomas’ name occurs in Matthew (10:3), Mark (3:18), Luke (6) and Acts of the Apostles (1:13), but in the Gospel of John he plays a particularly distinctive part. Thomas is often condemned for his lack of belief, but Thomas was equally courageous, willing to stand by Jesus in dangerous times. He also relentlessly sought the truth. Like an inquisitive child, he constantly asked questions. And, his wonderful profession, “My Lord and my God,” is the clearest declaration of Jesus’ divinity in Holy Scripture.

Thomas, Loyal Follower
When Jesus announced His intention of visiting the recently deceased Lazarus in Judea—a few miles from Jerusalem and dangerously close for someone as unpopular as He—Thomas said to his fellow disciples: “Let us also go, that we may die with him” (John 11:16). When the worried disciples wanted to keep Jesus from going for fear He would be stoned, Thomas, in a moment of bravery not often expressed by the Apostles before Pentecost, rallied the others to stay by their Master come what may.

Thomas, Inquisitive Student 
Later, in John 14:1-5 it was St. Thomas who raised an objection prior to the Last Supper:

Thomas said to Jesus, “Lord, we do not know where You are going, how do we know the way?”

With the keenness typical of the Twelve, Thomas misunderstands Jesus’ reference to His death and resurrection. Thomas’ question provides Jesus an opportunity to teach one of the most profound and difficult truths of His ministry. Jesus said to Thomas: (John 14:6) “I am the way, and the truth, and the life; no one comes to the Father but through Me.”

Thomas, Doubting Apostle
Lastly, and more famously, St. Thomas is remembered for being absent from the Upper Room the first time Jesus appeared to the disciples after His Resurrection. Thomas dismissed the accounts of the others by saying, “Unless I see the mark of the nails in His hands and put my finger into the nail marks, and put my hand into His side, I will not believe”(Luke 20:25). Eight days later Thomas made his act of faith. He fell at the feet of Jesus and said, “My Lord and my God!” and Jesus replied, “Because you have seen me, Thomas, you believed. Blessed are they that have not seen, and yet believe” (John 20:25-29). This incident gave rise to the expression “doubting Thomas.”

Thomas, Reluctant Missionary
Accounts of Thomas’ missionary activities are unreliable, but the most widely accepted report holds that he preached in India, although he was reluctant to start the mission. According to the Acta Thomae, the apostles divided up the world for their missionary labors, and India fell to Thomas. However, Thomas claimed that he was not healthy enough and that a Hebrew could not teach Indians; even a vision of Christ could not change his mind. Christ then appeared to a merchant and sold Thomas to him as a slave for his master, a king who ruled over part of India. And that’s how he landed up in India!

Here’s an illustration of 6 facts about St. Thomas

To this day, Saint Thomas is venerated as the Apostle of India. In fact, there exists a population of Christians along the Malabar Coast, on the western coast of India, who lay claim to conversion by St. Thomas. Their tradition holds that he built seven churches, was martyred during prayer by a spearing on the “Big Hill” near Madras, and was buried in Mylapore, on the east coast of India. Ultimately, St. Thomas’ remains were transported to Ortona, Italy, where they reside today.

Winning Faith

Photo, Poem by Fr. Terry Q

Amidst the rough and rubble
discard and garbage heap
they stand firm base and stature tall
with promises to keep
no matter what surrounds may be
they know they have a place
so grow and bloom
they must and will
whatever circs they face
papaya bougainvillea tall
with fruit and spread of bloom
as woodpile grass and garbage pile
concede for them make room

we find ourselves oft circumstance
denied of full control
surrounded by unsettling waves
disturbances untold despair the chances to survive
we question all the cost
we don’t believe we’ll come out live
despairingly we’re lost

but then a ray of beaming sun
through smog and smoke and fumes
comes piercing through
and loving grace
makes magic life resume
like nature plants and blooming flowers
we resurrect to glow
God’s love forever always there
our winning faith will show

How does SSO work?

We’ve just begun working on an internal portal for a client. One of the things our dev team has to work on is integrating SSO for authentication. Single sign-on (SSO) is a user authentication tool that enables users to securely access multiple applications and services using just one set of credentials.

Instead of twelve passwords in a day, SSO securely ensures you only need one.

Single sign-on puts an end to the days of remembering and entering multiple passwords, and it eliminates the frustration of having to reset forgotten passwords. Users can also access a range of platforms and apps without having to log in each time.

How Does an SSO Login Work?

Let’s see how SSO works with an example that we are all familiar with, accessing Gmail and YouTube

Step 1: A user visits Gmail, or any email service. Gmail finds the user is not logged in and so redirects them to the SSO authentication server, which also finds the user is not logged in. As a result, the user is redirected to the SSO login page, where they enter their login credentials.

Steps 2-3: The SSO authentication server validates the credentials, creates the global session for the user, and creates a token.

Steps 4-7: Gmail validates the token in the SSO authentication server. The authentication server registers the Gmail system, and returns “valid.” Gmail returns the protected resource to the user.

Step 8: From Gmail, the user navigates to another Google-owned website, for example, YouTube. 

Steps 9-10: YouTube finds the user is not logged in, and then requests authentication. The SSO authentication server finds the user is already logged in and returns the token.

Step 11-14: YouTube validates the token in the SSO authentication server. The authentication server registers the YouTube system, and returns “valid.” YouTube returns the protected resource to the user.

The process is complete!

Here is a short video from one of my favorite tech blogs that helps illustrate SSO.

What Is Single Sign-On (SSO)? How It Works. | Video: ByteByteGo


One of the key issues with SSO is that it has a lot of security implications if user credentials are compromised. IT teams use security concepts like the principle of least privilege and role-based access to ensure no user receives more permissions than they need or extensive access to apps they don’t use. Alternatively, if a user’s account is locked out for one reason or another, they will be unable to access all systems or applications that use the SSO account.

The use of multi-factor authentication (MFA) with SSO is a must. MFA provides an added layer of authentication that makes it more difficult for a malicious individual to successfully login to SSO services using stolen credentials. This significantly reduces the risk of an unauthorized user gaining access to multiple services or applications using a single account. 

In conclusion, Single Sign-On (SSO) has revolutionized the way users authenticate and access multiple applications, providing a seamless experience, improved security, and enhanced productivity. As technology continues to evolve, SSO will likely remain a vital component in modern authentication and access management systems, facilitating efficient and secure user journeys in a connected digital landscape.

Optimising Frontend Bundle Size

In today’s digital landscape, where web applications are becoming increasingly complex, optimizing frontend bundle size has become crucial. JavaScript frameworks play a pivotal role in building dynamic and interactive user experiences, but they often result in bulky bundles that can adversely impact website performance. 

The bigger the project size, the longer it takes to download the resources necessary for displaying it in a browser—and users who experience slow-loading pages are less likely to return! Additionally, having a reasonable project size is especially critical if you’re browsing via mobile device, or if there are network problems.

So, an uncontrolled increase in bundle size can quickly become a problem. There are a ton of hacks and ways to make bundle sizes smaller, like tree shaking, lazy loading, or removing unused dependencies. We will explore various strategies and best practices for optimizing frontend bundle size specifically tailored to JavaScript frameworks. By implementing these techniques, developers can enhance website speed, reduce bandwidth consumption, and provide a smoother user experience.

Use smaller libraries

We highly recommend paying attention to the sizes of the packages you install and make note of how the overall bundle size increases when doing so.

Thankfully, to make this task easier, we can use Size Limit, a performance budget tool that shows how the bundle size of a project will be affected after adding a library. It can even calculate the time it would take a browser to download and execute the code.

We can also ensure small bundle sizes by giving library size its proper consideration as we choose a package from one of several analogs. There’s a handy tool which makes this really easy: Bundlephobia it checks the size of an npm package and analyzes its impact on application performance. Beyond merely showing the size of a particular library, it also has other valuable development information, such as showing the size effect of dependencies on the composition of the library, as well as its download time from npm.

Another cool tool is Moiva who’s main goal was to provide developers with a good tool to evaluate and compare npm packages in different dimensions – Popularity, Maintenance, Security, etc.


Use optimized images

Pictures and icons make up a significant percentage of a site’s total resources, so smaller image sizes can greatly impact a project’s overall size. 

Here comes Squoosh to the rescue. It’s a really handy web app that compresses and reduces image sizes. And super helpfully, it also instantly shows the images post-compression, so you can immediately see the balance of performance/image quality. Plus, with Squoosh, you can work with all modern image formats and perform image format conversion.

It’s very important to keep size in mind, and it’s also important to use appropriate image formats; new formats like WebP and AVIF perform better than older formats like PNG.


Are there any other tools/tips/steps you use for optimising your frontend bundle size? Let me know in the comments below

Our Lady of Perpetual Help

Our Lady of Perpetual Help (also known as Our Lady of Perpetual Succour) is a Roman Catholic title of the Blessed Virgin Mary as represented in a celebrated 15th-century Byzantine icon also associated with the same Marian apparition.

The icon has been in Rome since 1499, and is permanently enshrined in the church of Sant’ Alfonso di Liguori, where the official Novena to Our Mother of Perpetual Help text is prayed weekly. In the Eastern Orthodox Church, this artistic iconography is known as the Virgin of the Passion or Theotokos of the Passion due to the instruments of the Passion present on the image.

On 23 June 1867, the image was granted a Canonical Coronation and its official recognition of the Marian icon under its present title. The Redemptorist priests are the only religious order currently entrusted by the Holy See to protect and propagate a Marian religious work of art.

The feast day of Our Mother of Perpetual Help is celebrated on June 27, with novena devotions held every Wednesday. Under Pope Pius XII’s Pontificate, our Mother of Perpetual Help was designated as the national Patroness of the Republic of Haiti and Almoradi, Spain.

What is the symbolism of the icon?

  1. Greek initial for Mother of God.
  2. Greek initial for St. Michael, the archangel.
  3. Greek initial for St. Gabriel, the archangel.
  4. Mary’s mouth is small for silent recollection. She speaks little.
  5. Mary’s eyes are larger, for in all our troubles, they are turned towards us always.
  6. Star on our Lady’s veil means she is the star of the sea who brought the light Jesus into this world.
  7. Red tunic is the color worn by virgins at the time of Christ (AD33).
  8. Christ’s hands turned palms down into his mother’s indicate that the grace of redemption is in her keeping.
  9. Mary’s left hand supports Christ possessively. That means she is his mother. It’s a comforting hand for everyone who calls on her.
  10. Dark blue mantle – the color worn by mothers in Palestine. means Mary is both virgin and mother of Christ.
  11. The entire background is gold representing the heaven.
  12. Golden crown placed on the original picture as a token of many miracles wrought by our lady invoked under the title of perpetual help.
  13. Greek initials for Jesus Christ.
  14. Foot with falling sandal represents Christ’s divine nature, barely clinging to earth. The human nature is symbolized in the other foot to which the sandal is more firmly bound. This simply means that Christ has two natures, Human and Divine. 

The devotion to Our Lady of Perpetual Help has grown steadily over the centuries, as more and more individuals turn to her in times of need. Her image serves as a reminder that even in the face of adversity, we are not alone. She reminds us that there is always someone ready to assist us, offering solace and guidance along life’s journey.

Our Lady of Perpetual Help holds a special place in the hearts of many believers, providing solace, guidance, and intercession. Her image serves as a constant reminder of the enduring power of faith, compassion, and love in our lives. Whether it is in times of joy or sorrow, her presence offers comfort and hope to those who seek her assistance. The devotion to Our Lady of Perpetual Help continues to flourish, as people find solace and inspiration in her unwavering care and maternal love.

The World of Fonts and Typography

In the vast digital landscape, developers are the architects and builders who shape the online world we inhabit. Their expertise is crucial in creating functional, visually appealing, and user-friendly websites and applications. While developers traditionally focus on code, algorithms, and functionality, a critical aspect often overlooked is the impact of fonts and typography on the overall user experience.

Fonts and typography play a vital role in shaping how information is perceived, consumed, and understood by users. Just as the choice of words can evoke different emotions, the right font selection and typographic treatment can significantly enhance the visual appeal and legibility of digital content. Consequently, developers who understand the nuances of fonts and typography possess a powerful toolset to create compelling digital experiences.

Typeface vs. font

The actual printing blocks used by original typesetters belong to a font. The style of the text, however, is generally thought of as the typeface (or just “face”). If you want to get OO about it, a font is the instance of a typeface.

So for example, in this diagram below, “Roboto” is the typeface, whereas “Roboto bold” is a particular font:

Face vs Font

Sometimes a typeface is called a font family.

The individual characters are known as glyphs. For example, the character “a” may be represented by two different glyphs:

Glyph

So a modern font maps Unicode character IDs to their glyphs. Hence a font includes a database of glyphs.

Leading and Kerning

Leading (pronounced like the element “lead” because it comes from the strips of lead used by those original compositors between each row; you can just about make them out in that picture below) is the distance between two lines of text, baseline to baseline. Presentation systems will often refer to this as “Line Height”. Tweaking this can make your long text fit in their boxes, or make the text look quite wrong. Worse, until you see lines with enough clashing ascenders and descenders, you might mistakenly think it is ok.

The term tracking is used to describe the process of proportionally spacing out all the letters in a word:

Example of Tracking

But kerning is the letter spacing between certain pairs of letters that the human eye just likes. Again, these qualities were discovered by the first typesetters on their hot metal presses.

Example of Kerning

These differences are important yet unpredictable. The reason they matter to engineers is that occasionally, we like to use non-proportional fonts (like Courier) in order to get a terminal-like look, with fixed spacing that might be convenient, yet we forget that the resulting text may be unreadable.

Note that this is different from justification, which uses space between words to stretch a line so that it fits flush against one or both margins:

Mostly we read text aligned left with a ragged edge, although newspaper columns can still be fully justified. Justification can give a cleaner, more formal look overall, even if the space interruption looks odd. Typesetters can also put space between the letters in words (hence the need for tracking) to enhance the effect.

Serif vs. Sans Serif

A serif is a decorative line or taper added to the beginning and/or end of a letter’s stem, which creates small horizontal and vertical planes within a word. That is “feet” or “tails”

And my high school French is good enough to work out that “sans serif” means without these tails. (sans = without in French!)

Serif vs. Sans serif

Now from a design point of view, serif fonts look “old and established” whereas sans-serif fonts look “modern”. So authoritative newspapers like to keep to serif fonts (Times refers to both a font and a newspaper) whereas most websites like the space left between sans-serif faces such as Arial or the original Helvetica.


By delving into the world of fonts and typography, developers can collaborate effectively with designers, enabling them to bring their creative vision to life while ensuring optimal functionality and user experience. The ability to choose appropriate fonts, adjust typographic elements, and implement best practices empowers developers to create visually appealing interfaces that engage and captivate users.