Search This Blog

August 30, 2020

Multi-tenant Architectures

 


Multi-tenancy Application Deployment Architecture could be modeled in 4 broad ways:

  1. Separate Apps & Separate Databases
  2. Shared Apps & Shared Databases
  3. Separate Apps & Shared Databases
  4. Shared Apps & Separate Databases
There is no right or wrong here. It's about choice and consequence that you should consider taking into your business context and constraints. In this post I intend to jot down a some key points to keep in mind for each of these multi-tenant architecture. These are more of quick notes for my quick reference, a cheat-sheet of sorts when I have to make choices. And I guess this can come handy to you too in your wise decision making.

Separate Apps & Separate Databases

  • Easiest to implement from development and deployment stand-point.
  • Just automate the deployment infrastructure for every tenant for quick set-up.
  • Most expensive of all the models from infrastructure cost stand-point.
  • Relatively longer deployment time for newer application versions, at scale. 
  • More wastage from infrastructure resource utilization point of view.
  • The application's statelessness criteria for scalability would mean:
    • not holding user-request data
  • Suitability:
    • This is the best way to begin your SAAS platform until product-market fitment.
    • When you provide SAAS as white-labelled product.
    • When you deploy your SAAS product at client infrastructure, maybe for compliance reasons.
  • Challenges:
    • How do you optimize resources for cost?
    • Not succumbing to the temptation of having different code-bases for different tenants. Yielding to this temptation is like getting those easy financial loans at very high interest rates and with the notorious rider of terms and conditions, that is often overlooked blinded by dreams... just as in gambling houses. Often though, the gamblers here are the Product Management team and the losers that get publicly shamed are the development teams.

Shared Apps & Shared Databases

  • The most complex beast of all the multi-tenancy architectures. Depending on the magnitude of tech-debts and gap in the discipline of engineering management, the complexity often grows many-folds increasing the risks of product stability and scale.
  • Maximizing infra utilization every bit for maximum profitability. 
  • Challenges:  
    • How do you manage as volume of transactions  and data increases? The relational database by its virtue is vertically scalable and not horizontally scalable. Now this means it could become a bottleneck sooner than you think as you onboard more and more tenants, depending on the volume of transactions and data.
    • In case of SaaS apps that provides lot of customizations on the UI, how do you get this tenant specific configuration optimally for latency? Wix eCommerce, Shopify, etc.

Separate Apps & Shared Databases

  • A model where tenant specific configuration are tied to deployed instances, but all share a common database. The data isolation per client is achieved by prefixing database schema with tenant info. 
  • You got many web-frameworks and web-plugins supporting this model of prefixing-queries with tenant specific data, to hit the right datasource. For example, apartment (rails/ruby), multi-tenant (laravel/php), springboot (java), etc.
  • Relational database instances are expensive. It way pricier than your application instances and is not as disposable as your compute instances can are. You got to do a bit of forward looking into future for its capacity planning.
  • When you are managing your database instance as a SaaS provider and want to optimize on the overall cost, often the easiest thing to do is use shared database.
  • The application's statelessness criteria for scalability would mean:
    • not holding user-request data
    • not holding database-responses
  • Challenges: 
    • How do you manage as volume of transactions  and data increases? The relational database by its virtue is vertically scalable and not horizontally scalable. Now this means it could become a bottleneck sooner than you think as you onboard more and more tenants, depending on the volume of transactions and data.

Shared Apps & Separate Databases

  • A request can hit any of the available application instance.
  • Tenant specific configuration is got dynamically with every request.
  • The application's statelessness criteria for scalability would mean:
    • not holding user-request data
    • not holding tenant's configuration
    • not holding database-responses
  • Challenges: 
    • How do you hit the right database dynamically on a per request basis? How do you do it optimally for latency? Think  of Atlassian suite of products like Confluence, Jira, Bitbucket etc.
    • In case of SaaS apps that provides lot of customization on the UI, how do you get this tenant specific configuration optimally for latency? Wix eCommerce, Shopify, etc.

Hope that helps you in your design choice for your SAAS architecture...If your experience is otherwise from mine, or that you disagree with any of my points, do pour your thoughts and help me learn from your experience.

August 27, 2020

Norton isn't what it claims to be -- an Anti-virus

I recently purchased an Acer Predator series laptop that came bundled with Norton anti-virus trial pack for Windows 10. I got this laptop for my development work and so I'm a little too crazy about engineering discipline. What does that mean? The first thing that I did was make a recovery drive from that fresh image of the laptop. This came to my rescue later as you'd find through further in this post.

So after a month of trial period of Norton, I wanted to uninstall it and install my choice of anti-virus (that is K7 anti-virus, for the curious). When I uninstalled Norton, it went thought without an error. But when I tried to install K7 anti-virus, it complained that Norton Security Ultra is installed in the system and that it needs to be removed before installing K7. But Norton is nowhere to be seen in my system's Control Panel > add/remove programs. As the world would have it, this seem to be some defacto unethical practice in play embraced by greedy anti-virus companies making them depend on it by force. They provide another software installable that needs to be downloaded to remove the tool the remnants of anti-virus from the operating-systems. For the curious, K7 lists such companies and their tools, from where the users can be download the software, to get rid of their old rogue anti-virus software that stays to spy on you possibly. So from being an anti-virus software they become the virus/malware themselves. This is shame!

Side-note: K7 won my heart in better user-experience in adopting their software. I never had issues deleting their software and using another one in their place thus far.

I tried to download the suggested anti-virus removal software (NRnR.exe) from Norton's website that claimed to have removed the remnants from my operating system when in reality it didn't. K7 anti-virus was still seeing the Norton Security Ultra in my operating system. When I googled for this problem, I realized that I was not alone but a lot of them have been through this same issue of finding it difficult to get rid of norton anti-virus software from their operating system. That left me wondering, how come no one sued this company for willfully causing a lot of pain and frustration. And how come so many other anti-virus companies embraced this unethical practice as a norm is beyond my understanding.

As a customer you have a choice to keep them at bay and not try them for free even. Like they say, "there is no free food". Beware!

I reached out to customer-care of both Acer, and Norton in vain. Acer's tech-support is just horrible. Norton's tech-support was plain dumb once and wicked the other time around. Norton seemed to have system automation for tech-support, that perhaps forced their team to reach out to me the second time only to make me feel more bitter with their wickedness with them plainly blaming it to be Acer's fault.

This seemed like a dead-end. I was about to download a fresh installable of Windows 10 and lo behold, Windows 10 provided an option to reset the PC without any of the bundled software. I'm starting to love you windows! It would have been much better if I have had the option to choose which of the bundled software I don't want in the process of re-setting my PC.

So here are the steps that you should follow to get out of this situation:

  1. System Settings
  2. Reset this PC
  3. Click "Get started" button
  4. "Keep my files" option
    1. Change settings
    2. Turn-off pre-installed apps
    3. Confirm
  5. Reset
This is the fastest was to get going with your system as factory reset without any bundled software. Windows is super smart that it spits out an "Removed Apps.html" file on your new desktop for your reference on the drivers and apps that came bundled with the operating system, that you may want to take a look and consider installing it on your system. This helped me to download the required drivers and apps as needed.

Hope this helps you too, should you have any of the rogue anti-virus software that remains in your PC on a stealth mode, possibly prying on you.

P.S: In case of Norton anti-virus, open REGEDIT in windows and search for the following terms to confirm if Norton is completely out of your system : "norton", "symantec" (because Symantec acquired Norton), "SymIRON", "SymEvent", "SymEFASI", etc. Do not try to edit/remove it manually or with any tools like CCleaner. You may end up with broken-registry as I had suffered. This may result in windows acting weird to crashing, forcing you for complete fresh install from external source.

P.S: Some of the ways I tried to uninstall Norton from Windows 10 are below (approach I took to preserve my existing setup and hope of minimizing my overheads):
  • Factory Reset. Uninstall from "Add/Remove Programs" in control panel.
  • Factory Reset. Uninstall from "Add/Remove Programs" in control panel and use NRnR.exe.
  • Factory Reset. Uninstall using NRnR.exe.
  • Factory Reset. Uninstall using CCleaner.
  • Factory Reset. Uninstall using Revo uninstaller.
  • Factory Reset. [Various other combinations of above]
P.S: I have no affiliation with K7 other than being their customer for a good couple of years now. You are free to choose your anti-virus software..just ensure that they too are not the ones that play rogue..Cheers!

Lastly, I'm hating Acer for bundling uninstallable Norton softwares with it. So should you decide to buy an Acer laptop, you now know what is the first thing you should do -- get rid of Norton without any second thoughts!

References

August 17, 2020

Connect to MongoDB on Windows host from WSL2

 It took me a day to lose my hopes on this issue to come to a conclusion that this is not possible. But then, wanted to give that last few tries, again... And lo behold, it worked!

So what should you be doing to get this working on your windows-wsl2 environment? This is what I did as workable set-up:

  1. Uninstalled MongoDB, one that was installed by windows installer. This one has its own quirks and issues with permission, leading to unexpected error of it being unable to find data directory. In my case, for some reason the installed version didn't honor the config file and was throwing up all of a sudden.
  2. Downloaded a zipped version and unzipped to to my target directory in windows. This one wouldn't come with a mongod.cnf file. So make sure, you create the default config file mongod.cnf, alongside mongod.exe and let its contents look like the one below (where you replace storage.dbPath and systemLog.path property values):
    ----
  3. Get your host windows IP address from powershell by running the command ipconfig to see an output like below:

  4. So now your mongodb connection string in your WSL2 would look like: 'mongodb://192.168.1.6:27017/myprojectdb'.
You should now be good to go!

August 16, 2020

GraphQL FAQs


  1. Is GraphQL a DB? No! For graphDB checkout options like ArangoDB, OrientDB, Neoj, DGraph etc.

  2. Is GraphQL an interface to Graph DB? No! Think of it as a parallel to REST or SOAP way of exposing your APIs.

  3. Is GraphQL a replacement for REST? It may or may not depending on your business context.

  4. Can GraphQL co-exist with REST? Yes!, it sure can.

  5. Does GraphQL have good tooling support? There is good tooling support to get you onboarded and get going. There needs to be more though, say for example, support in defining your GraphQL schema.

  6. Has GraphQL got supported libraries in my language platform? Checkout https://graphql.org/code/ for list of libraries by language, for client-side support and server-side runtime support. And there are also much more goodies in there to explore and experiment with.

  7. Is there a big picture view of GraphQL landscape that I can see? Do checkout https://landscape.graphql.org/.

  8. Is GraphQL better than REST? That depends on the metrics you are looking out for.

  9. Okay, how does GraphQL shine better over REST? Some of the things include,

    1. Simpler API grammar if that pleases you, GET for read operations and POST for write operations.

    2. Adopts better with need for "Evolutionary APIs", mitigating the need for upfront thought on "Versioning APIs" as contracts. This is a super cool thing that this Agile world of development desperately needs to fight its competitors.

    3. API to ask what you want explicitly and get just that and no more. This could mean better performance on both client-side and server-side.

  10. What are the areas where REST shines over GraphQL? Some of the areas include,

    1. Unlike GraphQL, REST needs no additional infrastructure. REST is fluent API that best leverages HTTP protocol to gain maximum mileage. Bow to Roy Fielding for this!

    2. Caching comes for free and easy with REST. This is relatively harder and needs additional infrastructure.

    3. Good part of the world has gone past heavy-weight SOAP to adopting light-weight REST which is the defacto-standard for the entire toolbelt and ecosystem. GraphQL made its presence known resulting in increased "reference-implementation" libraries across language platforms. How this will unfold beyond this hype is yet to be witnessed..

  11. Constructing and maintaining the GraphQL Schema on the server-side with Express.js isn't looking easy for me. As the graphql schema size grows, fitting the schema within the back-ticks is maintenance pain for me. There is not expand/collapse of parts of stringified schema after all. Also, absence of intellisense for this stringified piece is a pain in refactoring schema definitions. Am I missing something? You are not alone here, is the only consolation I have for you at this juncture. I have the same pain and I alleviate it a bit by modularizing the schema to separate files and use string interpolation in the schema definition file. This alleviates some of the said pain points. But absence of intellisense during development is a pain in the back making me question if I'm witnessing "graphql pop-culture" or genuine strengths of it. I'm still experimenting and so this opinion may change and will be updated as I learn.
  12. Not all fields are relevant to all consumers of my API either for the reasons of security or business context. Take for instance, the password field in the User isn't required beyond the signup or password change functionality even for the very user and is breach of security for others to get even the hash of it in their context in fetching Users. Is there a way I can customize this behavior in GraphQL? That's a great question and I'm yet to figure it out. But do hope there is a way out for this, as this is a very basic criteria, after all. My reference API would be Github API, for this.
  13. Given that the API's exposes the fields, would it end-up being too rigid for Public APIs where you don't own the client/consumer app? Sorry, I don't have an answer for this one. Github can't be taken as a reference case for this, so I'd have to look out for a business case likely in the B2B space where different clients demand different needs from an API.
  14. I see a myriad of ways to building GraphQL APIs for consumption and unsure how one is different from the other and if I am missing something. Am I? As I see it, you will still be an early adopter of GraphQL, given the state of evolution that it is in today. Thus, your choice of platform could determine if you are taking SDL-first or code-first approach to development. And then your choice of runtime, could determine how you design and build your schema, how you implement your resolvers (if you know what it is in the graphql context), etc. Doing a PoC with some of the popular options will help you determine what best fits your team context.
More would be added as I experiment with GraphQL and have more conversations in this space. Stay tuned..

August 12, 2020

Is your Java app, container ready?

 If you miss this, you will end up in exclaiming, "But it works in my machine!!..", when your app crashes in production environment that is containerized. This is one of those situations, that remind us that tech is hard and demands preparation.

Containers are for modern apps that run on modern platform. If you are having apps that are dependent on JRE prior to version 8.x, you are dealing with legacy apps that aren't container ready. 

Simplistically speaking (which is enough for this context), a container is in reality a single process which provides isolation by leverage cgroups and namespaces of Linux operating systems. Unfortunately though, these doesn't isolate CPU and Memory of the host. If configured for a container, the container-orchestrator (say, Docker Swarm) keeps a tab at the usage in real-time against this configuration and when a container constantly breaches the configured threshold, it marks the container as unhealthy and kills the process it considers as rogue, thus crashing your application.

Now the way JVM works by default is that it tunes and manages itself by looking at 2 key environmental metrics -- the CPU and the memory. Any JVM older than Java 8.x is not container aware and thus will access metrics from the host operating system and not from the container itself. Do you now see the problem? By ignoring the fact that it is running in a limited container environment (which typically is a subset of the host OS) and imagining that it has all the host CPU and memory for itself, its operational strategy will go wrong leading to application crashes.

Starting JRE 8.x (where `x` depends on your vendor), the support for containers were introduced. The JVM can recognize the memory and CPU configurations of the container in which it is running. But you got to enable it for your JVM to make it container-aware. 

In case of Oracle JVM, you do it with below jvm settings:

  • Memory : Set the following flags:
    • XX:+UseCGroupMemoryLimitForHeap
    • XX:+UnlockExperimentalVMOptions
    • XX:MaxMetaspaceSize=<your_cgroup_limit>MB
  • CPU : Manually overwrite the following parameters based on your cgroup limits configured for the app:
    • XX:ParallelGCThreads
    • XX:ConcGCThreads

References

Book Review -- 7 Databases in 7 Weeks

 


You won't make a whirlwind tour. You won't be lost in the jungle of details either.

With this book as a medium, you fly in the jungle of databases, getting a good taste of the landscape, to help you have good appreciation of which one is good for what purpose.

I felt productive travelling with the author and believe you too would feel so. Go make your journey with the author -- reading the book!

You can follow me on GoodReads for reviews and recommendations on others books that I have read.

August 9, 2020

Versioning Approaches for RESTful APIs

When you develop your application for consumption by other applications, you do so by exposing your application's endpoints. This endpoint could emit XML or JSON data depending on whether SOAP or REST protocol is supported. As reality would have it, the domain keeps evolving keeping up with the demands of the consumer applications and the challenge is not all consumer applications want the same kind/structure of data or that they aren't keeping up with the pace of your evolution. So that brings the need for versioning your API endpoints, to meet the backward compatibility of at least some of your consumer applications. This leaves us with the question, as to how do we do versioning of our endpoints? And this post is about versioning the REST endpoints. 

There are 4 below ways in which you can version your REST APIs:

  • Option 1: URI Versioning
    https://mydomain.in/api/{api_version}/myresource
    https://mydomain.in/myTargetResource/myTargetService/{api_version}/
    https://api.plivo.com/v1/myresource
    https://api.twilio.com/api/2020.06.01/myresource
    https://instance_name.salesforce.com/services/data/v49.0/
  • Option 2: URL Query Request Parameter Versioning
    https://mydomain.in/api/myresource?version=1.0.0
  • Option 3: Custom Request Header Versioning
    https://mydomain.in/api/myresource
      headers[X-API-VERSION=1.0.0]
    https://mydomain.in/api/myresource
      headers[Api-Version=1.0.0]
    https://mydomain.in/api/myresource
      headers[MyCustomHeader=1.0.0] where,
    • Any headers beginning with X- are custom headers, and are not included in the HTTP spec..
    • There are a few interesting bits in the response headers. As expected, the Content-Type is application/json.
  • Option 4: Media Type Request Header Versioning
    https://mydomain.in/api/myresource
      headers[Accept: application/vnd.vendorprefix-v1.0.0+json]
    https://mydomain.in/api/myresource
      headers[Accept: application/vnd.mycompany+json;version=1.0.0]
    where,
    • Accept header in http advertises which content types, expressed as MIME types, the client is able to understand. Using content negotiation, the server then selects one of the proposals, uses it and informs the client of its choice with the Content-Type response header.
    • The vendor prefix (vnd.) indicates that it is custom for this vendor.
    • The +json indicates that it can be parsed as JSON, but the media type (defined by Content-Type header) should define further semantics on top of JSON.

There is no one approach that is always better than the others listed above. What works for you, depends on your context and in part is also, likely a subjective decision. That said there a few things to take into consideration during your discussions with your team and they are the following questions that can help you find your deciding factor:
  • Do you (or your consumer applications) see versions in URL as noise polluting it? If so, you can rule out options 1 and 2 in the list above.
  • Do you (or your consumer applications) see versions in custom Headers as noise polluting it? If so, you can rule out option 3 and potentially even option 4, if you are too finicky about it.
  • Which approach is the easiest to implement? An answer to this depends a lot on your choice of framework and architecture. Does your choice of framework support routing for sophisticated URL Versioning? 
  • How does it affect caching? For instance, header based versioning (options 3 and 4) affects URL based caching, because all the versions share same URL; you will have to change your caching strategy to accommodate request headers in them.
  • Do you document your API for publishing? What is its implication on the choice of tool for documentation to accommodate versioning strategy to how it gets published.

Different companies has taken different routes to REST API Versioning. Here are some examples of companies for each of the versioning strategy.

Additional Resources

August 3, 2020

Unable to checkout Git repo on Windows?

This post is about looking into the order in which you debug the reason for your inability to checkout Git repo on Windows operating system. It could be because of the following reasons and you should debug in that order:
  1. Existence and validity of your SSH Keys
  2. Presence of files in your git repository whose names are reserved words in Windows OS
The next section of the post delves into these two pointers in detail.

Existence and validity of your SSH Keys


  • You should have SSH keys (typically id_rsa and id_rsa.pub) in your operating system path $HOME/.ssh/. If not generate it with ssh-keygen.
  • You should have the contents of the public key (id_rsa.pub) added to your list of SSH Keys in your Git remote repository. In the case of Github, it will be in your personal settings page

Windows OS incompatible file names in your git repository


This is a little crazy Windows OS weirdo. After making sure that I indeed have the SSH Keys setup right both in my local windows-os and in the remote Git repository (Github in my case). But how do you do that? 

After hours of hair-splitting to think that SSH keys isn't setup right and I was only left frustrated and hopeless. A little insight into why I was misled to thinking so and you too could be trapped by this very step. I tried what others prescribed to validate this, which is to run the below commands:
ssh -T git@github.com
ssh -T your-github-id@github.com
While the first command turned out successful, the second one failed with an exception stating, "... Permission denied (publickey)" leading me into the rabbit hole to be lost in darkness.

The best thing to do when your lost is to take a break from the problem. You would still be thinking about it at the back of your mind, which is a good sign ;)

So after my break and back at my desk, the next thing that I tried was do exploratory testing to validate my assumption. And so I tried to checkout a couple of other repositories to see if that works. And it did. Damn, my SSH Keys setup was indeed right and that I was wrong to assume that I missed something right there. 

Side-note: Best test case for this kind of use-case is to create a simple repository with only a Readme.md file in it and see if you can checkout that repository. If that works good, the problem is likely with your operating system and the repository contents. In my case the remote repository had a file named aux.js
 
So now the problem is with my current repository which worked in my other laptop having Ubuntu OS? That leads me to wondering if there is something in my repository that my Windows OS isn't liking? I slap myself and get back to basics of reading that error I get when I checkout this troubling git repository. The error message that I got mid-way through checking out read something like below:
error: invalid path 'src/hoc/aux.js'.
fatal: unable to checkout working tree
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry with 'git restore --source=HEAD :/'
I now have zoomed in into the file aux.js as the possible cause, because windows is unable to create that file. When I tried to manually create a file by that name, I was shocked to learn that windows doesn't allow me to create one by that name, because aux is a reserved name in windows that refers to some device. And boy Windows has quite a few such reserved names and if you got files created by those names in your non-windows operating systems that make it to remote Git repository, your other developers using windows operating systems will be at a loss. 

There are other such reserved names in windows os. Do not use the following reserved names for the name of a file: CON, PRN, AUX, NUL, COM1, COM2, COM3,..., LPT1, LPT2, LPT3, ... Also avoid these names followed immediately by an extension; for example, NUL.txt is not recommended.

Below are two possible ways to solve this problem: 
  • The quick and easy route is to change your git config by running: git config core.protectNTFS false
  • The other is the hard route that I recommend for portability reasons, if it is doable in your project. And that is to rename the file to something that windows developers can consume without any issue.
It is important to know the other windows operating limitations as well for project portability on windows platforms:
  • In Windows, filenames are case-insensitive.
  • In Windows, certain characters are not permitted as part of file names.
For this reason, it is important to consider the following links to see if you have broken any of windows conventions in your file naming:

August 2, 2020

Know Your Windows 10


I was looking into all these details to decide on my options in purchasing the kind of laptop that I want. I ended up purchasing a customized Lenovo laptop, only for it to be cancelled from their end after 6-7 weeks failing their promised delivery in 4 weeks time. Lenovo laptop delivery timelines seem to historically bad and their support is just terrible. I suffered great loss because of their slack. Subsequently, I grew really impatient and wanted to get one ASAP with Windows 10 Pro operating system pre-installed. This narrowed my choice to very few models that didn't impress me much for their hardware specs and price. I opted to prioritize on hardware specs and experiment on the software side of things. And that helped. For the curious I got myself an Acer Predator Triton 300 laptop and have post my experience with it thus far in another post.

This blog post has those little things I wish I knew about Windows 10, when it was most important for me but discovered/learned later. I practically battled my time with Ubuntu OS and Mac OS prior to that. I never cared to think about these details when I was using Windows 10 during my gig at corporate houses in the mean time; understandably there were other things to focus.

  1. If you are using Windows 10 Home, you can use Remote Desktop Connection (RDP) to connect to other systems but not share your desktop with others using it. To share your desktop with others using native RDP app, you must upgrade to Windows 10 pro.
  2. Hyper-V is disabled in Windows 10 Home edition. So if you are purchasing a new laptop, you are better off getting one with Windows 10 Pro OS installed instead of Windows 10 Home. Cost saving tip!
  3. If you are in a country like India where you have plethora of options to buy Windows 10 Home laptop with very limited options for pre-installed Windows 10 Pro or customised laptops, you can always upgrade to Windows 10 Pro via Windows Store at half the price (INR 8000 incl. taxes), instead of buying a new one from windows website at full price (INR 18000 incl. taxes). Microsoft managed to lend its ears to the market and respond positively to its consumers.
  4. In your Control Panel > Turn Windows Features On/Off, you should enable Windows Defender Application Guard that offers a secure container from internet browsing to protect your host OS from malicious attacks. To take advantage of this though, you need to use Microsoft Edge browser only. 
  5. Windows Office Home/Student pack works well on Windows 10 Pro OS. So if you are a developer wanting both Windows 10 Pro and MS Office for your personal needs, you have have them both together without any incompatibility issue.
  6. You can get your pre-installed windows 10 license key from your terminal aka command prompt by running it as administrator and executing the command: wmic path softwarelicensingservice get OA3xOriginalProductKey. Note down this license key for future reference.
  7. Do you know that when you upgrade from Windows 10 from Home to Pro, your license key actually changes. I got this confirmed from Windows Support Team!
  8. Do you know that when you upgrade from Windows 10 from Home to Pro, you end up getting a Single User License (aka Retail license) instead of the OEM license. At least, I think I had only the OEM license prior to windows upgrade. You can check the type of your license by opening your terminal or powershell in administrator mode and executing the command: slmgr /dli
  9. With WSL (Windows Subsystem for Linux) support introduced by Microsoft in 2019, you don't miss your Linux distros. I have Ubuntu installed, for instance.
  10. If you are on Windows 10 Home, you can use WSL-1. If you are on Windows 10 Pro, you should use WSL-2 to leverage windows native virtualization, for better performance. 
  11. Do you know that you can download and use Windows 10 Home for free, legally for personal use. The only downside is that you can't have any customization done to it and you will see a watermark on the screen to activate your version of installed operating system. Cheers to Microsoft for that smart strategy of allowing the masses to experience its work.
Should you think there is more that I should know as a developer, do drop your comments.

August 1, 2020

My Reviews Of Acer Predator Triton 300 Laptop

My Context

  • I am no gamer.
  • I got this for my personal projects using Kubernates (requiring better CPU) and resume my journey of learning Deep Learning (requiring better GPU).
Note: Your mileage may vary depending on your context.

Pros

  1. Better looks with minimalist design that you can take it to office/school without it distracting others during your work.
  2. Better pricing than its competitors for its specs. It's closest competitor IMHO would be Dell G-series laptop.
  3. Build quality is sturdy with metal body.
  4. The keys on the keyboard are top-notch in that I like the touch-and-feel.
  5. The touch-pad is too good that you would start to hate other laptops for this purpose. 
  6. This is a gaming laptop with brilliant honeycomb venting for quicker heat dissipation. And it works! 
  7. Acer's Aeroblade technology promises better heat dissipation and so far it has been cool enough. 
  8. It supports Dual SSD plus One HDD. I have my Windows OS in SSD and data on HDD. My OS loads in about 5 seconds today with not many softwares installed and added to startup list thus slowing it down. 
  9. Default backlit keyboard with blue light (that can be customized) is pretty comforting to my hands that does a poor job in typing. 
  10. Higher screen refresh rate of 144 hz. This is not of any use to me though, given that I am not a gamer. 
  11. Full HD screen does come to your favor, for it reduces your eye-strain with its crystal clear clarity of smaller fonts instead of tearing it down. 
  12. It has got a killer wifi router supporting superior bandwidth performance. Should come to your rescue when you do screen sharing for your development work.
  13. The monitor lid is sturdier in comparison to its competitors where the lid might be a bit flimsy shaking. I think it's because of thicker bezels around the screen in this laptop that gives it the desired sturdiness that I wish it has to suit my handling.

Cons

  1. Built-in speaker sound quality is relatively feable and poor. 
  2. Keyboard layout is discomforting when coming from traditional layout experience. More specifically:
    1. Power button is where End button is. Luckily, though, it wouldn't function when Windows has loaded as part of its default configuration.
    2. Because the arrow buttons are compressed within the layout, it eats away space in numeric-pad area. This has 2 implications which irritates me:
      1. Instead of Zero, I end up pressing Right-Arrow :(
      2. Instead of pressing Shift, I end up pressing Up-Arrow :( Note that the Shift-Key is halved!
  3. Power button is positioned as one of the keys in the top right corner, increasing the chances of accidental selection. 
  4. Sharp edges of the metal body, that can tear your skin. You can use it as a weapon of self-defense, when you need it :P 
  5. The Laptop should work on improving the battery span as well. For normal developmental usage like mine it lasts over 3 hours only. This is perhaps a known downside with any gaming laptop and may be Acer is doing a better job over its peers like Lenovo.
  6. Acer India support could do better. Registering the product for warranty is bit of a hassle in India, at least. The constant pop-up from Acer installed app asking to register, when their backend is dysfunctional is just a little too irritating.
  7. Beware! Norton bloatware in the name of anti-virus that comes pre-installed with your laptop is one unwarranted pain. Norton is a notorious rogue software that fails to get uninstalled cleanly. Even their own software meant to cleanse the system post their un-installation, fails to do what it supposed to do. I hate it when a laptop comes with a bloatware that I can't uninstall. Check out the minimally painful escape route to get rid of this disaster.
  8. Acer's pre-installed app Waves MaxxAudio could typically psych you out. Guess why? When you plug your headset into the port, every now and then, the camera turns on for a while before it turns off, leaving you wondering if your newly purchased laptop got hacked. You would be skeptical of Acer wondering if they have pre-loaded with any bloatware that is causing this issue. I spent an hour or so, before I could drill it down to the junk app that comes bundled with Acer laptop - Waves MaxxAudio. Luckily you can turn off this feature in the app as stated in Acer Website.