Pope Francis 10 years on

Early in Pope Francis’s pontificate, the sense of expectation was enormous.

He spoke simply and powerfully. He stayed away from the typical trappings of papal luxury. He was seen as an outsider and a natural reformer. He stirred some trepidation among conservatives, but not enough to override the global adulation. “The People’s Pope,” Time magazine called him, naming him person of the year in 2013.

Today is 10 years since Francis was elected pope. In that time, he has retained many of his personal hallmarks, and he has altered the Catholic Church in important and potentially enduring ways, including by making pillars out of issues such as migration and the environment.

Pope Francis asked for prayers as he spoke about the future of the Church and his pontificate so far in an interview published yesterday.

“Being the pope is not an easy job. Nobody has studied before doing this,” the pope said, recalling how St. Peter also “fell” when he denied Christ.

“But, after the resurrection, Jesus chose [Peter] again,” Pope Francis explained. “That is the mercy of the Lord towards us. Also towards the pope.

Asked about his wish for the world, Pope Francis responded: “peace.” He also criticized what he called a “globalization of indifference” in the face of tragedies like war: “The turning a blind eye and saying, ‘Why should I care? It doesn’t interest me! It’s not my problem!’”

Francis said one of his dreams for the future of the Church is a Church which ventures out into the world and is among the people.

Addressing readers of the newspaper, he asked for prayers from those who pray and “good vibes” from those who do not. “The pope loves you and is praying for you.”

“Even if bad things happen, even if you have had a bad experience with someone from the Church, don’t let it condition you. The Lord is always waiting for you with open arms. I hope you succeed in experiencing it within your lives like I have within mine many times. The Lord has always been beside me, above all in the darkest moments.”

As Pope Francis celebrates the 10th anniversary of his papacy, may we lead by his example of caring for the poor, reaching out to people often overlooked and sharing the joy of the Gospel.

Here are 10 facts about Pope Francis, shared by the Archdiocese of Bombay.

Morning Rose Bud ~ Fr. T

morning rose bud
each one prophecy
each one promise
sequence fulfill
unfathomable way
only He knows
till dazzle bloom
and way beyond

His touch of grace
His always there…

my life a prophecy
His promise made
I must fulfill
through living faith
of what must be

His plans unfold
uncertain ways
my joyous life
not sacrifice
but fully lived
sufficient grace
an offering

photo and poem by Fr. Terrence Quadros SJ

Suitcase on Wheels

We put wheels on bags after we put a man on the moon, made the internet and started flying the Boeing 747. What took so long?

In 1970 Bernard Sadow had no luck selling his new invention into Department stores.

“I showed it to every department store in New York City and everybody said I was crazy. ‘Nobody’s going to pull a piece of luggage with wheels on it.’ People just didn’t think in those terms,” 

He was a Vice President of a Luggage company, and simply put 4 wheels on the bottom of a normal case. Macy’s finally started selling them, with a campaign called ” “the Luggage That Glides.” A patent for 2 years followed, before other makers jumped into the market.

We learn from this than innovation is inextricably linked with culture and society.  

Until the 1970’s travel was for the wealthy only. 

People who travelled didn’t carry their own bags, they had staff too. The idea they’d lift things themselves was outrageous.  
And thus the buyers were not the users and there was a huge disconnect in the market. 

(For similar reasons domestic use of electricity was slow, why would a house owner care how hard their staff found it to light lights, or cook food) 

The idea of dragging luggage on wheels was seen as less sophisticated or too utilitarian. 

But Sadow didn’t change the world. The bag was still slightly awkward to use, as as more people entered the travel market, traveling more and more often, it was a bad bag for people who wanted to travel alone or for quick trips. 

It was even later, in  1987, US pilot Robert Plath created the modern cabin bag. As a pilot for Northwest Airlines, Robert Plath had to travel very frequently so he knew what people really needed.

He made a far smaller version of Sadow’s suitcase and reoriented it to be more upright and with a longer telescopic handle. Now the bag would be easier than ever to move, with no bending over.

It’s then the bag took off. 

But in an even more useful twist to the tale, we learn than neither really invented wheeled luggage. It was 1954, when the Polish/Croatian painter Alfred Joseph Krupa first attached wheels to a bag.

Krupa was an amateur boxer and martial arts practitioner, and he also taught target shooting and fencing, and a chronic inventor.

But the timing wasn’t right, he didn’t have the right connections, he was born into a country that didn’t have a clear path to global markets at the time, and he had so many ideas, he could never just focus on one. 

There is a lot that can be learned from all of this. Take from it what you wish.


My biggest takeaway here is that the idea itself, however crucial, is only about 1% of the process needed to make it work. And that there’s a bit of luck with timing and opportunities involved, perhaps outside of our control. Then I get to thinking…how many potentially great inventions/prototypes are out there, but are victims of bad timing or placement, or the inventor being discouraged from an initial rejection?

Lenten Poem

Christmas is over and it’s Lent all over again,
Should I eat a meat sandwich or should it be plain?
Should I fast for 5 hours or skip breakfast and lunch,
Or just have tea and a little something to munch?

Should I stop smoking or should I shun drink,
Should I stop thinking those wrong thoughts I always think?
Should I be patient with the one driving in front of me,
Should I give a mouthful to my colleague or just let him be?

This, my friends, is what we’ve made Lent out to be,
A set of bargaining chips, to be paid as salvation fee!
It is just a reminder for you and for me,
The price has been paid, by the One on the tree!

Let’s make use of this time given to us for no fee,
To reconcile with the world and the One who set us free.
Because no chicken or chocolate can ever pay the price
That has already been paid by our Lord Jesus Christ.

Just repent.….

Anonymous

How to Reduce Mobile App Size

Mobile phones have evolved a lot over the last few years. However storage is still a big concern. In addition to all the apps we have installed, we still would love to have a lot more storage for our photos and music. This makes the mobile app developer’s job a little more challenging as they need to keep their application size in control to make downloads fast and improve the user experience. 

Source: CleverTap

When forced to uninstall a few apps to make room in their phone’s memory, a person is most likely to choose from a list of apps that take up more space and are used the least. If your app is on that list, it’s likely getting deleted.

A bigger app size also results in longer installation time and slow launch times. When choosing between apps with similar features and similar ratings, a user is more likely to go for one that takes up less space in their phone. 

Here are a few techniques used to reduce app size and improve performance so your app gets downloaded and stays on your ideal user’s device.


Compress image files

Many apps, if not all, make use of images to improve user experience. Reducing the size of these images is an easy way to decrease your app size.

There are two ways to reduce image size:

  1. Remove metadata from image files (lossless compression)
  2. Reduce file size by reducing image quality (lossy compression)

Remove metadata from image files

Your image files have a lot of metadata stored in them that has nothing to do with image quality. For example, an image taken with a digital camera may store information about the date, time, shutter speed, flash mode, and camera manufacturer and model. Removing this information will reduce the file size without having any impact on image quality. 

To remove metadata in Windows 11, right-click the image, go to Properties, and click Details. The window will give you the option to ‘Remove Properties and Personal Information.’

Source: Bitrise.io

Click on that, and you’ll get another window to select the metadata you want to remove.

Source: Bitrise.io

Select all and click OK. That will remove all metadata. This method will not result in a significant decrease in file size. However, doing it for every file in your app will result in a cumulative reduction in size that can make a noticeable difference.

To remove the metadata from images on MacOS, you need to use a third party application like Exif Metadata to remove metadata from your photos.


Use vector graphics where possible

Vector graphics are images generated based on mathematical commands that tell the system to connect a series of points. Vector graphics are smaller in size and more scalable compared to raster images — images that are saved as pixels. Vector graphics are usually saved in SVG (scalable vector graphics) format.

The use of vector images for icons, symbols, logos, and characters is very common, and you can create a vector version of any raster image using Adobe Illustrator or a similar tool. Doing so will result in the loss of some colors and sharpness — so this method is not applicable in all cases. If your app is image heavy and you think that converting all raster images into vector images will be too resource intensive — or there will be an unacceptable loss of quality — you can always go for image compression.


Use image compression tools for raster images

Image compression tools such as TinyPNG can compress images by reducing their quality by 50% or more. This is also called lossy compression and is achieved by removing less critical information from the image. This is an irreversible process, and the compressed image cannot be restored by any means.

With high-resolution images, the human eye cannot spot the difference between the original image and the compressed image. That is why lossy compression using an image compression tool is a good idea to reduce the size of all images used in your app. 

Using this method, you can reduce the file size for each image by a few hundred kilobytes or just a few kilobytes depending on how much you choose to compress the images. If there are dozens or hundreds of images in your app, the saved space will become significant.


Reduce or remove unused resources

As you keep updating your app, some features may become obsolete, and some layouts, colors, strings, etc., may slowly go out of use. Removing unused resources of all types when you update will help you keep your app size small.

Remove unused resources in iOS

You can open up the app in Xcode and see all the resources in the resource list or use a tool like FengNiao to detect all unused resources. The tool helps you find all unused resources, which you can then remove from the IPA file. Your IPA (iOS App Store package) file is a compressed file that contains all the resources, code, and metadata that iOS uses to distribute and install apps.

Remove unused resources in Android

Use the lint tool to detect unused resources in your APKfile. The APK file is the Android equivalent of the IPA file — it is a compressed file that contains all the resources, code, and metadata that Android uses to distribute and install apps. The lint tool shows warnings about all unused resources, and you can then proceed to remove them.

Use Android App Bundle for Android

The Android App Bundle is a pre-APK publishing format that contains all of your app’s resources and code. Google Play uses it to create multiple APKs, each optimized to support a different device.

Using the Android App Bundle helps you reduce download size. That’s because once you sign up for it, Google Play only delivers the resources necessary to run the app on each device. For example, Super Mario Run on Google Play has a download size of 60 MBs for devices with smaller screens and 80+ MBs for those with bigger screens.

You can use the Gradle command to build your App Bundle by using the following command: 

./gradlew :app:bundleDebug

Use App thinning for iOS

App thinning removes unnecessary resources and code from your IPA file. Using this technology, you can decrease the size of your app on your users’ phones. When you export your app to the App Store, you get the option to enable App thinning.

Additionally, you can enable on-demand resources. The App Store hosts all resources for released apps — resources being images, video, and sound files. Enabling on-demand resources means resources are downloaded in the background as needed, only called when needed, and removed when not needed automatically. You have to mark on-demand resources by tagging them.

The App Store also creates multiple variations of your app for different versions of iOS and devices. These variations only contain the necessary resources needed to run the app; all else is removed. This is very similar to how Android App Bundles work. The App Store does it for every new app now, i.e., you don’t have to enable this option from anywhere.


Aim for a lower-than-average app size — and keep it that way

The top apps on the App Store are 153 to 206 MB in size, and those on Google Play are 55 to 73 MB. This also depends on the type of app. A gaming app will definitely be bigger than a To Do app. But aiming for a lower-than-average app size can lead to quicker installation and better performance — giving you a chance to increase your conversion rate and user retention.

Having a small app size on release is good, but as you release new updates and features, your app size will grow. To keep the app size lower than the average for your category, you need continuous testing and monitoring capabilities.


Any other tips/ideas/suggestions on reducing app size? Let me know in the comments below!

Fading Leaf ~ Fr. T

quiet offering
given fully
freely given
light lit green leaves
hush spray below
in upward strive

rising wave
soft presence
yearn ascent
beyond reach

fading leaf
duty done
waits descent
to earth soil
there decompose
enrich the earth

each moment blessed
with have to do
and graceful live
life no regrets
of glory gone
or how to be
new differently.

we live life paths
by God designed
His choices made
all falls in place
though now and then
we stray His ways
return invite
His always there

lost sheep He finds
shoulders return
to fold within
and pledge of love.

Javascript: Measuring Time to Make Informed Decisions

As an engineer, especially when working on enterprise-grade applications, our coding is influenced by many factors. It is no longer about if your function worked or your ability to achieve the desired result. It is rather about writing performant code, thinking about time complexity vs space complexity, scaling, and ensuring that your application is as fast as possible.

The console.time() method is the console class of Node.js. It is used to starts a timer that is used to compute the time taken by a piece of code or function. The method console.timeEnd() is used to stop the timer and output the elapsed time in milliseconds to stdout. The timer can be accurate to the sub-millisecond.

console.time() takes the parameter “label” and the label must be the same name when calling console.timeEnd() to stop the timer and get the time output to the console. If the label name is not the same, it will throw Warning: No such label ‘{label name}’ for console.timeEnd().

To understand this better, let me use the stopwatch concept to illustrate. Let’s assume you wanted to start a race, you would start your stopwatch and when the race ends, you would stop your stopwatch. So console.time() is the same as starting your stopwatch and console.timeEnd() as stopping your stopwatch. Easy right? 

Now let us take an example of merging two objects with time complexity in mind. Remember, it is not about what works but what works in the shortest time.

const object_1 = {
  id: 3,
  age: 34,
  gender: 'male',
  name: 'Ed Sheeran'
}
const object_2 = {
  car: "Ferrari",
  colour: "red",
  year: "2023"
}
//Start the timer
console.time('object_assign')
const merge_1 = Object.assign(object_1, object_2);
console.timeEnd('object_assign')
//end the timer

//Start the timer
console.time('rest_operator')
const merge_2 = {...object_1,...object_1}
console.timeEnd('rest_operator')
//end the timer

In the above code, I merged two objects using Object constructor method Object.assign() and Javascript spread operator.

Time output on the console:

object_assign: 0.257ms
rest_operator: 0.032ms

From the console output, we can see that the rest/spread operator is faster than Object.assign()

And hence we can now make an informed decision. Please note that in this article we are NOT talking about why rest operators should be used over Object.assign(), but about HOW to use console.time! :)

Ready for another example?

const arr =  [1,3,4,5,3]

//Start timer
console.time("map")
arr.map(item => item)
console.timeEnd('map')
//End timer

//Start timer
console.time("forEach")
arr.forEach(element=>element)
console.timeEnd('forEach')
//End timer

Output

map: 0.188ms
forEach: 0.035ms

So we saw how console.time() and console.timeEnd() can be used as a quick debugging tool to identify bottlenecks in our application.

You can check the MDN documentation for console.time() and  console.timeEnd()

Taking Control Of Your Happiness

We’ve all seen kids going about their day with a large majority spent in a joyful state. You would have to try really hard to make a child unhappy. But as we grow up, that trend reverses. We spend most of our days unhappy and we are constantly looking for something or someone externally to make us happy.

We are the most comfortable generation in the history of humanity and yet we are not it’s happiest one! In fact, all the comforts and advancement in our history was because of some level of unhappiness faced by our ancestors.

Yet, here we are, in the middle of all the comfort constantly living in fear and anxiety-more worried about what could have been or might be, rather than enjoying what is.

There is nobody in this world that has not been happy or doesn’t know how that feels. Somewhere along the way, we just decided to give in to the rigors of life and die a slow death rather than live an exuberant life.

Our happiness is our responsibility, just like a million other things that we are responsible for, which is probably why so many of us are not trying! We are responsible for our careers, for our health, for our sleep, for our relationships and on top of all that, now we have to figure out what makes us happy!

If you are relying on anyone or anything else for your happiness, stop that right now. If you feel like you’re not quite doing what you want to be doing and you’re not quite the person you want to be, let reading this be the sign that you have a change to make.

There are those who take control of their life and there are those who are life’s victims. Which do you want to be? The type who confidently assesses their own worth or the type that complains about feeling undervalued? No one can ‘make’ you feel anything. Happy or sad. Every emotion you feel you can be in charge of. Giving away control of your feelings? Sort it out.

Recognize that you are in control of your happiness.

The first step is to recognize that you are the one in control of your happiness. Your entire happiness lies within you. The more you learn to tap into it internally rather than depending on others to bring that out, the easier it will be for you to be happy.

Your mantra today

I have at all times, within me, all the happiness that I need and I am solely responsible for my happiness.

Once you recognise that you are in control of your happiness, here are a few other things that have helped me:

  • Do what makes you happy
  • Stop worrying about what others think
  • Stop complaining
  • Stop comparing

Happiness might be subjective but it sure isn’t rocket science. We make things complex when they don’t need to be. The options I have mentioned above are not complex. They are the simplest of things that you can do on a daily basis to increase your joy quotient.

Only you have the power and inclination to control your own happiness. No external factors should penetrate your inner core. No one can make you feel anything you don’t want to feel, it’s all a choice. You’ve got this!

Here’s my all time favourite “Happy” song to get you going!

How to be Less Reactive

When we are emotionally reactive, we tend to be more stressed. We feel angry or often hurt because we react impulsively. Putting it another way, we overreact. Our perception of the existing situation confronting us becomes altered. This makes us prone to making the wrong decisions.

Correcting a misunderstanding is much harder than learning to think before acting. When in control of your reactions, you can better evaluate current situations, see better solutions, and establish rapport with other employees. 

So how can we stop being emotionally reactive?

1. Come From Curiosity, Not Conclusion
If you want to be more intentional in your response, slow your thinking down. Instead of drawing conclusions, ask questions to assess the accuracy of your conclusion. When you check your assumptions, stay open to being wrong, and assume positive intent about the other person, your interactions will take an entirely different turn.

2. Surround Yourself with Positive Thinkers
If it’s possible, surround yourself with people who are constructive in the way they think and feel. Whom you associate with has a powerful impact on how you perceive things. When a problem arises, and the folks you mingle with all give varying suggestions that result in cheerful ones, you are blessed. And you will statistically be less prone to stress.

3. Don’t Take Things So Personally
High reactivity often comes from elevated personal investment. In other words, when we take things personally. That’s a state of amygdala-hijack. First, breathe. Reclaim the brain. Second, shift perspective. People are usually clear on what they want from another person. When we are clear what we want for the other person, it allows us to take things less personally and be more deliberate. 

4. Learn How To Pause And Seek Clarity
This requires that you take some time prior to answering someone or stating your opinion. One of the most effective techniques is taking that simple pause: 10 seconds to inhale and exhale in lieu of blurting out the first thing that comes to mind. Consider asking a question to clarify what you’ve heard instead of giving an answer. It can save you from a bad assumption.

5. Think And Edit, Then Speak
Think, edit and then speak. Stop and ask yourself, “Is what I am about to say going to move the conversation forward for me, for them, and for the relationship?” If the answer is no to any of these pieces, then it’s time to take a deep breath and come back to it when the answer is a resounding yes.

6. Ask More Questions
A lot of the time, we are reactionary because we are making assumptions. Perception check with people you are communicating with to ensure the message sent is the message received. Ask about people’s reasoning or thinking rather than jumping to telling them what they did wrong. And listen: The power of listening is often the best communication tool.

7. Don’t Let a Bad Past Experience Induce Emotional Reactivity
A previous negative experience may form a prejudice in your mind, even one you may not be fully aware of having. Remind yourself that whenever you are reacting to something in the present, you may be making an assumption because of an experience in the past. Disconnecting our previous experiences from our present ones helps us stop being emotionally reactive.

8. Sleep Well
Your emotions and your ability to have enough sleep have an intimate relationship. Sleep deprivation makes you more emotionally aroused easily and more sensitive to stressful stimuli and scenarios (in a negative way).

Research has shown that enough sleep (6 to 8 hours) is essential to better cope with emotional reactivity in everyday situations. So when you need to stop working or whatever you’re doing because it’s bedtime, stop. The benefits far outweigh the cons.


Hope these tips help you on your journey to self-improvement and self-care. Let me know in the comments below if you have any other techniques that help you be less reactive!

Shoelace: A Framework-Agnostic Web Component Library

Web components were introduced in 2011, but if you ask most frontend developers, they aren’t their first choice for composing UI layouts. This is partly due to an increase in JavaScript frameworks, component-driven development enthusiasts, and other esoteric factors over the years.

Two key drawbacks of web components are:

  • Web components don’t follow native HTML behaviour. 
  • Issues with backward-compatability and SEO

Now, in comes Shoelace, a UI library built on web component technology that offers the same experience as any JavaScript framework but with better perks. It defines all your standard UX components: tabs, modals, accordions, auto-completes, and much, much more. They look beautiful out of the box, are accessible, and fully customizable. But rather than creating these components in React, or Solid, or Svelte, etc., it creates them with Web Components; this means you can use them with any framework.

With Shoelace, you can:

  • Start building things faster (no need to roll your own buttons)
  • Build multiple apps with different frameworks that all share the same UI components
  • Fully customize components to match your existing designs
  • Incrementally adopt components as needed (no need to ditch your framework)
  • Upgrade or switch frameworks without rebuilding foundational components

A Better Developer Experience

A huge advantage of using Web Components is that you get real custom HTML elements with a familiar API. Let’s compare the markup for a Bootstrap button and a Shoelace button.

<!-- Bootstrap -->
<button type="button" class="btn btn-primary">Primary</button>
​
<!-- Shoelace -->
<sl-button type="primary">Primary</sl-button>

Even with this simple example, you can already see there’s less code involved. This becomes even more obvious with complex components. Let’s take a look at dialogs. Here’s a Bootstrap dialog.

<!-- Bootstrap -->
<div class="modal" tabindex="-1" role="dialog">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">Modal title</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        <p>Modal body text goes here.</p>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>

That’s a lot of markup! And there’s plenty of room for error with those aria attributes exposed.

Now let’s take a look at an equivalent Shoelace dialog.

<!-- Shoelace -->
<sl-dialog label="Dialog">
  <h3 slot="header">Modal Title</h3>
  Modal body text goes here.
  <sl-button slot="footer">Close</sl-button>
  <sl-button slot="footer" type="primary">Save Changes</sl-button>
</sl-dialog>

That’s much easier to work with! And there’s less room for error since the component handles its aria attributes internally. Pretty cool right?

Why Use It?

At this point, you’re probably wondering what sets Shoelace apart from other component libraries. For one, it’s framework agnostic, meaning you can use it in React, Vue, Angular, and any other framework you throw at it. This is perfect for teams that want to use different frameworks with the same components for a consistent UX.

Since Shoelace components are Web Components, they’re built on standards that browsers have committed to supporting for a long time. As old frameworks age and new ones emerge, you won’t have to spend time rebuilding buttons, inputs, and other low-level components. Shoelace will just keep working.

If you prefer to use the platform and avoid frameworks altogether, that’s fine too. Shoelace works great with vanilla HTML+JS!

And yes, Shoelace is open source and available under the MIT license, so it’s free to use and anyone can contribute to it!

If you’re interested in learning more about Shoelace, here are some links you’ll find useful!