Jekyll2023-11-01T04:37:52+00:00https://www.usmankhaliq.com/feed.xmlUsman KhaliqCoder,Data Science Enthusiast, ICT4D Practitioner.Usman Khaliqusman.khaliq91@gmail.comEnforcing HTTPS on GitHub Pages Served via an External Domain Name2023-11-01T00:00:00+00:002023-11-01T00:00:00+00:00https://www.usmankhaliq.com/ssl-cert<p>It took me an embarassingly/surprisingly long time to realise that the HTTPs certification on this blog had failed, and the page was not opening with an https connection. The culprit for this breakage was <a href="https://gist.github.com/oldmud0/1a60cab1bcbddee9daa1c0b95823c27e" target="_blank">this</a> change that GitHub made in 2018(I’m not sure that the SSL certificate for this website had been broken since then…), when they changed the suggested IP addresses to put on the A records for domains that used GitHub Pages. What should’ve been a relatively (at least in theory) easy change to make, turned out to be anything but. It also was yet another example on how poorly designed web applications(which in this case, is the JustHost admin portal) are in general, and how it is almost a borderline miracle that so much software with real world usage has been built over the years.</p>
<p>To save myself(and any potential readers who are frantically searching for similar issues) from the hassle of re-tracing the steps that I used for fixing this error, here is what I did.</p>
<ol>
<li>
<p>Navigate to the admin panel of your domain host, and change the A records to the new ones mentioned in <a href="https://gist.github.com/oldmud0/1a60cab1bcbddee9daa1c0b95823c27e" target="_blank">this</a> post. It takes upto 24 hours for the records to be percolated across the different CDNs. You can use <a href="https://www.whatsmydns.net/" target="_blank">this</a> website to check whether the A records for your domain have been updated before proceeding to step 2.</p>
</li>
<li>
<p>Refer to <a href="https://medium.com/@rebeccavarley/how-to-fix-bluehost-ssl-certificate-temporarily-unavailable-error-67053286a313" target="_blank">this</a> excellent blog post written by Rebecca Varley on how to navigate to the CPanel of your domain host, and to refresh the SSL certificate of your site.</p>
</li>
<li>
<p>In the root of your project’s GitHub repository , check that there is a CNAME file with the name of your domain, preceded by <code class="language-plaintext highlighter-rouge">www</code>(this was a critical mistake in my case. I’m not sure when were the settings changed to make it mandatory for the domain name to be pcededed by <code class="language-plaintext highlighter-rouge">www</code>).</p>
</li>
</ol>
<p>4.Follow the steps in the comment by <a href="https://stackoverflow.com/users/1974961/hugolpz" target="_blank">Hugolpz</a> in <a href="https://stackoverflow.com/questions/54059217/how-to-fix-domain-does-not-resolve-to-the-github-pages-server-error-in-github" target="_blank">this</a> Stackoverflow thread.</p>
<p>And that should do the trick.</p>Usman Khaliqusman.khaliq91@gmail.comIt took me an embarassingly/surprisingly long time to realise that the HTTPs certification on this blog had failed, and the page was not opening with an https connection. The culprit for this breakage was this change that GitHub made in 2018(I’m not sure that the SSL certificate for this website had been broken since then…), when they changed the suggested IP addresses to put on the A records for domains that used GitHub Pages. What should’ve been a relatively (at least in theory) easy change to make, turned out to be anything but. It also was yet another example on how poorly designed web applications(which in this case, is the JustHost admin portal) are in general, and how it is almost a borderline miracle that so much software with real world usage has been built over the years.We Made it, Mon2020-06-28T00:00:00+00:002020-06-28T00:00:00+00:00https://www.usmankhaliq.com/replug<p>While cleaning up my email folder today, I came across this email that I had sent to myself on the 15th of Jan, 2015. It’s always a bittersweet experience to revisit your notes from yonder years, and to reflect on how far you have travelled since then. I slightly chuckle to myself thinking about what was really bothering me when I wrote this, but trying not to be too self-deprecating.</p>
<blockquote>
<p>get a grip on yourself. Things arent working out the way you planned them to, but since when has life really been
a basket of roses? You, out of all people, should have realized that. If you want something in life, you need to fight
for it. And everything for you has been a struggle, but so far, you eventually do get what you want and whatever is
best for you right? Why lose hope and become so helpless at this junction?
Everything is not lost, far from it. You know what you really need to do in the next few months. There are loads of
amazing opportunities that you need to work on, instead of letting your head get to you. It is tough, it is difficult,
and it is a constan,relentless battle. But do not lose yourself in a self wallowing ball of pity and leave all of the
hard work that you have done for yourself.
Find that spark in yourself again. Make your sadness, your disappointment, your frustation into a form of inspiration
to start striving harder for what you really want to achieve. You yourself know what you are capable of, do not let
this happen to yourself. And stop falling constantly into that trap of thinking that it is futile, that it is already too
late for you to pick up your game.
Dont do this to yourself. Things will get better, everything will work out fine, find the faith that you have so
dramatically lost over the past few months, and get back to things. Stop overthinking, stop being so hard on yourself.
Go to sleep now. Wake up in a few hours time, study for your exams, reclaim that relentless spark back. The unread emails
and the evernote notes are waiting for you.</p>
</blockquote>Usman Khaliqusman.khaliq91@gmail.comWhile cleaning up my email folder today, I came across this email that I had sent to myself on the 15th of Jan, 2015. It’s always a bittersweet experience to revisit your notes from yonder years, and to reflect on how far you have travelled since then. I slightly chuckle to myself thinking about what was really bothering me when I wrote this, but trying not to be too self-deprecating.Accessing Google Cloud Platform Buckets From a Co-Lab Notebook Running R2020-06-21T00:00:00+00:002020-06-21T00:00:00+00:00https://www.usmankhaliq.com/gcp_colab_r<p>Last week, I set up a Google Co-lab notebook running on R (my preferred language for data exploration and early stages EDA). I wanted to access some buckets from a Google Cloud Platform(GCP) project that was being hosted on my company’s GCP platform. I used the <code class="language-plaintext highlighter-rouge">googleCloudStorageR</code> library written by <a href="https://code.markedmondson.me/">Mark Edmondson</a>.</p>
<p>In the documentation for the package, they specified downloading a service account JSON file from a GCP project, which would then be referenced by the library for connecting to the GCP project and accessing the buckets. However, since I wanted this notebook to be easily shared by other people across my organization, I did not want to access a JSON file that had the access keys for the API and which would need to be saved along with the Co-lab notebook. Instead, I wanted to connect and authenticate with the GCP project interactively and in real-time from the Co-lab notebook, which would allow anyone with the correct credentials for my organization’s GCP project to run the notebook on their own.</p>
<p>This seemingly simple workaround took longer than I had thought it would. With ample help from Marc, I was able to solve this issue using the code snippet below:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>install.packages("httr")
install.packages("R.utils")
install.packages("googleCloudStorageR")
if (file.exists("/usr/local/lib/python3.6/dist-packages/google/colab/_ipython.py")) {
library(R.utils)
library(httr)
reassignInPackage("is_interactive", pkgName = "httr", function() return(TRUE))
}
options(
rlang_interactive = TRUE,
gargle_oauth_email = "email_address",
gargle_oauth_cache = TRUE
)
tt <- gargle::token_fetch(scopes = "https://www.googleapis.com/auth/cloud-platform")
googleAuthR::gar_auth(token = tt)
</code></pre></div></div>Usman Khaliqusman.khaliq91@gmail.comLast week, I set up a Google Co-lab notebook running on R (my preferred language for data exploration and early stages EDA). I wanted to access some buckets from a Google Cloud Platform(GCP) project that was being hosted on my company’s GCP platform. I used the googleCloudStorageR library written by Mark Edmondson.The transience of life2019-03-10T00:00:00+00:002019-03-10T00:00:00+00:00https://www.usmankhaliq.com/transience-of-life<p><em>This post was first publised on my <a href="https://medium.com/@ottoman91/the-transience-of-life-223ff312f28f">Medium</a> profile</em></p>
<p>A case of bad flu can often send one to a trip down the rabbit hole of
“thoughts-that-have-been-regularly-pushed-back-at-the-top-of-my-overfilled-mind.”
I didn’t get much work done this weekend, and while mindlessly scrolling through
my phone/laptop/tv in the midst of Monday Blues, I kept thinking about young
people who have departed from this world. I did not personally know any of
these people that well — at best, they were just random acquaintances at
university. Now, a part of me wishes that I did know them well, that I had
known a bit more about their dreams, fears, aspirations in life. I’m not sure
what I would have done with this information. It’s just that, the idea that
people who are in their youth can so suddenly disappear from this earth, is a
bit jarring on some level.</p>
<p>We go through so many pre-defined motions every day. We tick off boxes from our
daily to-do-lists, we have grand plans about what we want to achieve 1,2,5 years
from now, but the hard reality is that none of us have a guarantee on the actual
time scale that we have to achieve all these things. When our reel of borrowed
time finally ends, what happens to all the thoughts and plans that we had made
for ourselves. Do they simply cease to exist, the output of hours of mental
heavy lifting just disappearing into a non-existing ether? Or are they out
there somewhere, part of the unified and invisible sub-conscious stream of
thoughts, ideas, emotions and plans that is and isn’t a part of the collective
human experience? Nobody knows, and perhaps nobody ever will.</p>
<p>Every human being has or had aspirations at some points in their lives. What
happens when these aspirations aren’t realized? Further yet, are these
aspirations even supposed to be realized? In our quest for wanting to change
the world and leaving our mark during our brief presence in this universe,
are we missing out a crucial element on how we should be living and experiencing
life? I guess these questions will keep me up every night until I recover
from my flu and am able to push them back to the long-term memory cache. I
hope those flu medicines do their magic soon.</p>Usman Khaliqusman.khaliq91@gmail.comThis post was first publised on my Medium profileReplug2018-12-05T00:00:00+00:002018-12-05T00:00:00+00:00https://www.usmankhaliq.com/the-restart<blockquote>
<p>I wrote this post last September as a reflection essay for my Design and Manufacture class
at Stanford. Reposting this again so that it can serve as a reminder of the things that I
want to restart doing.</p>
</blockquote>
<p>A blank slate, and the uncertainty that comes with it is something that I have been yearning for
since the past several years ; a blank slate on which I can shape up my ideas, thoughts and
combine them with the correct mindset and required skills to truly achieve what I want to in life.
I was born and raised in Karachi, the largest and arguably the most diverse city of Pakistan.
Witnessing the city’s stark inequalities while growing up made me aware of how the lottery of
birth pans out, and since an early age, I felt a nagging sense of doing something meaningful to
improve the lives of the less fortunate. While studying computer engineering in college, I
continued to explore the space of design thinking, especially in the context of creating services
for people at the bottom of the pyramid in the developing world. I developed a working
prototype for a low cost water purifier in urban areas, and my work was featured by Acumen, an
impact investment fund that works in Africa, Asia and South America. This exposure enabled me
to land a job as a computer programmer/researcher/product manager at a startup working in the
financial inclusion and agriculture technology space in Sierra Leone. Over the next three years, I
worked on a wide range of projects, ranging from advising the government of Liberia on how to
make their government processes more data driven and transparent, to piloting an infectious
disease surveillance system in Sierra Leone, and building a mobile phone based savings product
for subsistence farmers. At Stanford, I want to improve my design skills and focus towards
building products and solutions that can improve the delivery of life saving medical care to
people living in remote areas in Pakistan.</p>
<p>My hobbies are reading, writing, listening to music and street photography, although I have not
been involved with them as much as I would ideally like to. On weekends, I can usually be
found engrossed in my books with a journal nearby, penning down my thoughts on how I
interpret and perceive different situations. My favourite genres are science fiction, current affairs,
philosophy and economics.</p>
<p>It’s interesting how life experiences and circumstances end up shaping one’s outlook. Hobbies,
passions and fortes that were once second nature end up feeling completely alien and foreign,
which is exactly what happened to me while being away from home for almost seven years due
to college and work commitments. I listen to way less new music than I used to, I read fewer
books, and it takes an effort to clearly articulate ideas and thoughts that aren’t technical in nature.
I also feel a disconnect from the concept of “home”; in some ways I feel that I do not understand
the people and the place where I am from, frustrated at the general pettiness in thinking and
narrow-mindedness that is unfortunately present there. At times though, I miss the place and its
people, and the “inner voice” that is only triggered by a specific place and the memories and
mental images that one associates with it. I hope that the next two years at Stanford will help me
to make a hard reset, and rediscover the inner voice that got lost amidst all the mundane activities
that encapsulate ‘adult life’.</p>
<p>At Stanford, I want to build a strong design acumen in both physical as well as digital mediums,
and nurture the skill of translating ideas into tangible prototypes. I am passionate towards using
human centered design to build products and services that fulfill critical needs of poor people in
the developing world, and am immensely excited at the intellectual rigor that Stanford would
provide me to achieve this goal.</p>Usman Khaliqusman.khaliq91@gmail.comI wrote this post last September as a reflection essay for my Design and Manufacture class at Stanford. Reposting this again so that it can serve as a reminder of the things that I want to restart doing.SMS is still King in low tech environments2017-01-07T00:00:00+00:002017-01-07T00:00:00+00:00https://www.usmankhaliq.com/sms-is-king<p><em>In this piece,I talk about the science and emotion behind SMS Firebolt,
an SMS gateway built to democratize information sharing for the poor. I worked
on this project during my time at <a href="https://idtlabs.xyz">iDT Labs</a></em></p>
<figure>
<img src="/images/sms1.jpeg" alt="this is a placeholder image" />
<figcaption>
Mobile network coverage still outstrips mobile internet coverage in large
rural areas of the region. This, coupled with the low cost of sending SMS,
makes it a very attractive medium for building up tech based solutions
that aim to solve specific issues in the socio-economic space.
[Reference image by Ben Lyon]
</figcaption>
</figure>
<h2 id="2g-still-the-dominant-technology-in-west-africa">2G Still the Dominant Technology in West Africa</h2>
<p>Despite the upward trend in smartphone penetration in Sub Saharan Africa
(expected to reach 80 percent by 2022) in the mostly fragile sub-regional
block of the Economic Community of West African States (ECOWAS), 2G is still
the dominant technology, accounting for 90 percent of total mobile connections.</p>
<p>With spectrum availability being a challenge in the mass rolling out of 3G and
4G services, it is important to revisit the inherent assumptions that are
currently prevalent in the technology for development space of positioning
an increasing number of products solely on the smartphone medium.</p>
<h2 id="suitability-to-local-contexts">Suitability to Local Contexts</h2>
<p>Quite often, what gets lost amidst the discussions of using mobile phones for
augmenting the delivery of essential services is not on the potential of the
technology itself, but rather, on how applicable it would be in the local context.</p>
<p>Given the deplorable state of education in this region, it would be a stretch
to claim that the standard of digital literacy holds any better. The great
chunk of people at the base of the pyramid (BOP) are generally not comfortable
with using applications on smartphones, which limits the potential of these
applications to deliver a critical service to the end users.</p>
<h2 id="poor-infrastructure-to-support-smartphones">Poor Infrastructure to Support Smartphones</h2>
<p>Although smartphones are becoming cheaper by the day due to the influx of
copycat Android devices, it should be noted that most of these devices are
ill-equipped to smoothly run anything other than the most basic smartphone
applications, such as a web browser or an instant messaging service. Therefore,
this calls into question the assumption that the cheaper smartphone devices
can usher a mass adoption of mobile based products and services.</p>
<p>Mobile data is generally expensive for the average end users,and is available
under a pay-as-you-go scheme, thereby forcing the end users to mold their
internet consumption behavior . This greatly limits the potential of smartphone
applications to be scaled amongst the end users.</p>
<p>It is also important to understand that in rural areas, people often share cell
phones, with the younger and more literate members of the community assisting
the older community members in everything from making or receiving a call to
using mobile money. Generally, smartphone app design is skewed in such a way
that the user experience assumes a personalized, one-to-one relationship
between a user and his device. Mobile app developers and designers working in
the development sector need to appreciate this fact while designing applications
that provide a private service to the end users, such as financial credit, on a
device which is also actively used by other people.</p>
<h2 id="the-evergreen-benefits-of-plain-text-sms">The Evergreen Benefits of Plain Text SMS</h2>
<p>Mobile network coverage still outstrips mobile internet coverage in large
rural areas of the region. This, coupled with the low cost of sending SMS,
makes it a very attractive medium for building up tech based solutions that
aim to solve specific issues in the socio-economic space, since there is a
high chance that the message is received by the intended recipient at a cost
that is still manageable.</p>
<h2 id="the-inherent-challenges-with-building-novel-sms-products-and-services-in-the-region">The Inherent Challenges with Building Novel SMS Products and Services in the Region</h2>
<p>In spite of the advantages that SMS has, building products and services on top
of the medium is still a challenge, especially for non-tech savvy organizations
and individuals. These challenges stem from a number of structural realities
that exist in the SMS ecosystem, which can be summarized as follows:</p>
<ul>
<li>
<p>There is a lack of easy to consume application programming interfaces (APIs)
in the ecosystem. In laymen terms, APIs are boilerplate codes that allow for
using the functionality of software systems without having to understand their
underlying architecture in great detail. The major mobile network operators (MNOs)
in Sub Saharan Africa usually do not have well documented and publicly available
APIs that can be used by developers to build up SMS based services . As a result,
it is difficult for small players and new entrants to create novel ways of
delivering essential services via the SMS medium.</p>
</li>
<li>
<p>The general tech skill of individuals in Sub Saharan Africa, in particular
around building products that perform well in poor connectivity environments
is low. It is therefore challenging for local players to hire talent which can
utilize the underlying SMS infrastructure to build new products.</p>
</li>
</ul>
<figure>
<img src="/images/sms2.jpeg" alt="this is a placeholder image" />
<figcaption>
Photo by Ken Banks, kiwanja.net
</figcaption>
</figure>
<h2 id="sms-firebolt--an-sms-gateway-built-for-low-tech-environments">SMS Firebolt : An SMS Gateway Built for Low Tech Environments</h2>
<p>Keeping in consideration the importance that plain text messages still have as
an effective mode of communication for any product or service in our part of
the world, coupled with the inherent difficulty that organizations face in
incorporating SMS into their offerings, we are currently developing SMS Firebolt,
an SMS gateway that augments some of the challenges around quickly building
robust and scalable SMS services via the following:</p>
<ul>
<li>
<p>By providing a rich set of well documented APIs in a number of popular programming
languages, such as Java, Python and PHP. These APIs would encourage developers
to incorporate the gateway into their software products and allow them to send
SMS alerts to their end customers in various use cases.</p>
</li>
<li>
<p>By providing a pay-as-you-go service via which organizations can instruct
our team to send SMS alerts to their end customers at specific events.
SMS Firebolt has been written in the Spring Java framework, and at the backend
it is powered by the excellent open source Kannel WAP gateway to send messages
in real time.</p>
</li>
</ul>
<p>SMS Firebolt has been written in the Spring Java framework, and at the backend
it is powered by the excellent open source <a href="https://www.kannel.org/">Kannel</a>
WAP gateway to send messages in real time.</p>
<h2 id="how-we-envision-sms-firebolts-critical-usage-in-the-tech-for-development-space">How We Envision SMS Firebolt’s Critical Usage in The Tech for Development Space</h2>
<p>We would be incorporating SMS Firebolt in a wide range of both, our existing
products as well as in a number of services that we are currently developing
in the financial inclusion space.</p>
<ul>
<li>
<p>Eazy Bank, our suite of core banking software that is based on the MifosX
project, is currently being used by a number of micro finance organizations
(MFIs) in Sierra Leone and Uganda to assist them in streamlining their back
office operations. By linking it with SMS Firebolt, we would enable MFIs to
send regular alerts directly on the mobile phones of their end users, most of
whom exclusively use feature phones. We hope that making crucial information
more readily accessible to the end users would lead to an uptake in the
adoption of financial instruments.</p>
</li>
<li>
<p>We are currently in the midst of rolling out the pilot for iCommit, a
conditional cash savings service that uses mobile money and allows subsistence
farmers to save money from one harvest season to buy inputs for the next
growing season. iCommit extensively uses USSD codes and has a plain text
interface to encourage maximum update amongst the end users. SMS Firebolt
would be handing the flow of messages between the farmers and the service.</p>
</li>
<li>
<p>Widespread usage of mobile money in the rural areas of Sierra Leone is still
a massive challenge. To try and solve this, we are currently developing iAgent,
a peer-to-peer cash in and cash out service that adopts the “sharing economy”
model by allowing individuals to act as mobile money agents at their leisure.
iAgent would have both, a smartphone based interface and a USSD based plain text
interface. The text message based communication flow of the application would
be routed through SMS Firebolt.</p>
</li>
</ul>
<h2 id="the-critical-takeaway-lesson-follow-the-occams-razor-in-your-solution">The Critical Takeaway Lesson: Follow the Occam’s Razor in Your Solution</h2>
<p>The tech for development space is filled with horror stories about long delayed
projects and bloated products that aimed to “change the world”, but often ended
up causing some unintended negative externalities. Quite often, technologists
working in this space tend to overcomplicate the solution at hand, naively
assuming that the power of technology is sufficient to circumvent the structural
problems that plague developing and underdeveloped communities.</p>
<p>The reality is that technology alone is never a solution; rather, it needs to
augment existing communication and delivery channels that are working well.
Despite its age, plain text messages are still critically important for the
vast majority of people in the world. So the next time you have the urge to
brainstorm on yet another “app” that will make the world a better place, pause,
take a step back, and think on how to incorporate your service in less than
160 plain text characters.</p>Usman Khaliqusman.khaliq91@gmail.comIn this piece,I talk about the science and emotion behind SMS Firebolt, an SMS gateway built to democratize information sharing for the poor. I worked on this project during my time at iDT LabsAn efficient and quick way for removing a Homebrew package and all of its dependencies on macOS2017-01-06T00:00:00+00:002017-01-06T00:00:00+00:00https://www.usmankhaliq.com/homebrew<p><em>This article was first publised on my <a href="https://medium.com/@ottoman91/an-efficient-and-quick-way-for-removing-a-homebrew-package-and-all-of-its-dependencies-on-macos-32e9eaaffa2d">Medium</a> profile</em></p>
<p>Homebrew is an excellent command line package management tool for Mac OSx,
and it is rightly proclaimed as “The missing package manager for macOS”, as stated on its official website.
However, a few days ago, I came across an urgent task which I had not addressed before, namely, how to
cleanly and completely remove a package installed from Homebrew, along with all of its dependencies.</p>
<p>A quick online search rendered the following approach on <a href="https://stackoverflow.com/questions/7323261/uninstall-remove-a-homebrew-package-including-all-its-dependencies">Stackoverflow</a>, which included using an
external command called brew rmtree, which was to be executed as follows:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ brew tap beeftornado/rmtree
$ brew rmtree <package>
</code></pre></div></div>
<p>However, for some reason, when I ran this command, brew took an insanely long
time to update. I am not quite sure what the error was, but it was most
probably due to my crappy internet connection.</p>
<p>Nevertheless, I came across another method for achieving this task on the same
Stackoverflow answer thread. I found <a href="https://stackoverflow.com/questions/7323261/uninstall-remove-a-homebrew-package-including-all-its-dependencies/24070232#24070232">this</a> method to be easier and way quicker,
although it did take me a while to figure out how to run external brew scripts
and the configurations that need to be made to run them. To save others the
hassle and time of understanding how the configuration would need to be set up,
I am highlighting the steps followed below:</p>
<ol>
<li>Download the brew_clean script from <a href="https://gist.github.com/cskeeters/10ff1295bca93808213d">this</a> Github repo</li>
<li>Once you have unzipped the downloaded file, copy the brew_clean script
to /usr/local/bin. This would ensure that the script is global.</li>
<li>Make the script executable by running the following command in the /usr/local/bin directory:
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo chmod+x brew_clean
</code></pre></div> </div>
</li>
<li>Run the following command in your directory of choice to generate a file
that contains the list of all brew packages installed on your machine:
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew leaves > brew_packages
</code></pre></div> </div>
</li>
<li>Open the brew_packages file using your favourite text editor
( which is nano in my case for such small tasks). In the file, delete the name
of the package you want to remove. Save and close the file.</li>
<li>Run the following command to allow brew_clean to remove the package you
deleted from the brew_packages file:</li>
</ol>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew_clean brew_packages
</code></pre></div></div>
<p>And there you have it. You can verify that the package has indeed been deleted
by moving to the /usr/local/Cellar directory. The package that you just deleted
would no longer be listed in the directory.</p>
<p>Hope this helped. Happy coding and creating awesome software solutions for
the world!</p>Usman Khaliqusman.khaliq91@gmail.comThis article was first publised on my Medium profile