Categories
Blog Misc

Jr. Software Developer – My first Work Internship

“Be careful, because the code you write might set your pc on fire.”

This is the warning that my tutor gave to me at work.
When I had first heard that, I laughed at the sole possibility of something like that happening, even though deep down I knew she was right. 
Well, it is either that or my head exploding first.  

After a pretty intensive job search, I was able to get myself a three months internship in a company located in Bergen, as a Junior Software Developer.
I am glad I got this opportunity for a few reasons.

  • The first one is that I finally could enter the so-much called “Norwegian Bubble”(read The Social Guidebook to Norway to understand what I am talking about).
  • The second reason is that learning programming and software development directly on the field is allowing me to learn at a fast rate. 

Before the start of my arbeidstrening I felt pretty nervous, but I was then given a warm welcome by everyone part of the ValveWatch development unit.
Taken from the official website:

ValveWatch® is an automated, online valve monitoring system for critical valves and actuators brought to you exclusively by MRC Global. Users can remotely monitor a valve or actuator’s performance and correct degradation before it effects safe and reliable operation.

The same day I was then shown around and given documentation regarding safety at work.
I was surprised by how big the company building in Bergen was. Hopefully I will have the time to see all of our equipment in action.
The work day is a flexible 7.5hrs per day.
I am glad of the flexibility, because my work commute is long and has multiple intermediate stops. 
There also is a 30 mins lunch break and a cafeteria where you can take food. 
The company also includes a small gym.

Finally, I received a top of the line PC station (Threadripper 2950X and a triple monitor setup) and office furniture.

If you think this hardware to be overkill (especially considering that the software being developed does not have any complex graphical effect) then you haven’t experienced the great pain of building time.
I am not kidding: it takes me around a minute for the software to finish building.

During my development journey at MRC I learnt appreciating Stack Overflow as a documentation resource.
Stack Overflow is a programming-focused forum where developers can discussion development issues. 
You can find material that varies from beginners to expert levels of complexity.

It can happen to have a roadblock while programming.
I usually look up online for people that might have been in the same situation as me. 
It is a fantastic feeling when you see on Stack Overflow someone posting the same question that you have had in your mind. 

It is a little bit less nice when the same person is able to fix it on its own without explaining how:

These are the tools that I have been getting accostumed to:

QT is an IDE. 
In more simple words: It makes your life easier by including everything you need to develop under one and united roof. 
One of the benefits that probably all IDEs include, is error checks.
If for example you do not correctly write down a line of code, the IDE will inform you of that (and might give a possible solution too).

Practical example. 
I wrote the following line of code: 

int variableName = "Sentence here";

Since it logically is wrong, the IDE will inform me of the error, on the same line where I wrote the faulty code. 

Mistaken variable declaration.
I declared a variable that is supposed to store numeric data, and assigned the characters “Sentence here”, which are letters. Therefore, I get an error informing me of that.

GIT is a piece of software that tons of individual or groups of developers use to keep track of all the changes performed to the code base of their software. 

It is text interface based, but some of its functions are packed inside QT’s UI. 
I could for example “commit” my most code recent changes, and if I regret it afterwards, I can undo it by downgrading to a previous commit of my choice.
It works kind off like Apple’s Time Machine. 

Another useful feature of GIT is that you can see what’s between each “change” you have published and what code has been removed or added.
This is good in case you need to compare the code between each version. 

There also is a “branches” feature. 
It allows a developer to “clone” the current project, and then add a list of features to that specific branch. 
By doing so, each developers can work on their own branch with their own features and then merge everything together. GIT automatically handles all of that.

GitLab is a web platform based on Git and made for team development. 
You can see in detail all changes made to the code, and approve merging requests with the rest of the code base.

Atlassian Suite contains several web products aimed at developers. 
We use Jira and Confluence.

  • Jira is a task manager with lots, and I do mean lots of advanced settings. 
    It is helpful for self-managed tasks and to see how other members of the team are doing at the same time. You can put advanced descriptions for all tasks, and keep tracking of how much time you are spending behind one. There is optional integration between Jira and Git. 
  • Confluence is, in short, a Team Wiki for share documentation. 
    The web editor is highly advanced and you can create nice looking pages. Of course snippets of code are supported too. 
    The dev team guide on how to setup the development environment is in fact written on a Confluence page. 
    Since I encountered a few problems due to software updates, I could report snippets of it or just fix them myself.

Something that I found interesting was how we were going to communicate with each other.
Each developer has a huge office desk, a side table and their electronic equipment.
Since we all are facing against each other, it is not always easy to show the code we are working on. 

So, when we are working on code related issues, we use a real time chat application to share code snippets. 
We also sometimes share our PC screen so that other people can see what is going on over QT. 

I believe this to be an effective way of helping each other because it does not disturb other people that are focused on their own tasks. 
Less details will be lost during the conversation too. 
The office is great too.
It has everything you’d expect from a good workplace: a lot of space to move, a coffee machine, whiteboards to write on, a ‘break’ area, 

I want to focus for a moment on the workplace culture in Norway.
People are most passionate about their work here, but they also like to socialize while taking a few breaks here and there.
As long as you do your work and do not slack off, it is okay to take some time to breath. 
It avoids mental exhaustion by letting people relax for a few minutes and It helps coworkers to get to know each other.
The other ‘big’ moment to socialize is our half-hour lunch break.
We got a cafeteria with a selection of food that changes every day.
Unlike countries such as Italy, the lunch is NOT the heaviest meal of the day.
You can either take a few slices of bread and put something on top (Norwegian salmon is
HEAVEN), or a small packed meal. You also can pick up some fruit and a small dessert. 
All the food that is not taken will be recycled (at a farm I suppose?), or can be brought home. 

There also is a balcony where you can sit down and enjoy the weather. 
It makes you feel one with nature. 

 

This Covid pandemic hit hard on many people’s lives.
Mine included.
It limited my mobility to come back home in Italy and profoundly affected my mental health.

It also hit a lot of industries worldwide, and 200 thousand Norwegians lost their job as a consequence
Right now, Norway’s population is 5.328 millions. 
Almost 4% of the Norwegian populations became unemployed. Luckily NAV (Norwegian Labour and Welfare Administration) gave financial support to many people that needed help. 
While receiving unemployment benefits, my salary was slightly boosted due to the current Covid situation. 

So yeah, thanks for the help NAV! 💖💖

It felt great to finally be back in society, and in such a productive environment too. 
No matter where I look, I always have something new to learn.
And no matter how many times I ask, there are tons of people willing to explain to me and help me understand new things.
My tutor has been extremely dedicated into teaching all that I have learned so far here. 
Even though this is a software development internship, the department also has engineers that work on hardware solutions too. 

I am going to summarize everything that I have learnt here so far, week-by-week.

First thing I did was to set up the development environment on the machine provided my the company. 
As development environment I mean the OS and all the programs that a developer uses to work. 
In this case, my dev environment features an SSH Key, LLVM, Oracle Instant Client (allows application to communicate with a database), Git, QT, CMake, Java, some C++ APIs

I did have some roadblocks during the set-up phase caused by some libraries lacking on my development machine. I fixed them and updated our internal set-up documentation before proceeding.

I opened for the first time the ValveWatch codebase in QT Creator. 
I made a fast UI sketch of the CSV parser window I would have worked on as part of my project, and I afterwards had to create a new entry in a contextual right click menu. 

Example of Brave’s right click contextual menu.

QT allows you to connect code and UI elements both through its GUI and/or code. 
Something that I quickly learnt during my internship is to always prefer using the terminal rather than its graphical counterparts. 
The same concept applies for stuff like that.
Especially when unexperienced. 

I remember that while learning Python I was looking over how to create a basic interface for my BMI calculator (which BTW I am recreating in C++, you can see it on GitHub!) and felt discouraged regarding how to proceed. 
QT handles all of that stuff (at least for basic projects) on its own.

I created a button to select a file, and interfaced it with Windows Explorer’s file select GUI, and storing afterwards the full directory of a selected file in a string. 
By then, I could interface the string holding the file directory to the CSV parser.

My first taste of parameters-argument was when some data was being passed from the Client to my pop up window. 
A parameter is a variable sent, while an argument is a received variable. This is especially useful when calling functions through other functions. 

Finally, I learnt how to manipulate arrays and vectors to import the CSV data inside the computer memory. 

During my arbeidstrening, I took a 2 weeks break for a car trip I had planned before (I needed my head to rest for a while), and shot the video “Cæsar og Charlie“.

Coming back to work, I mostly did refactoring of my already existing code and we implemented a new CSV Parser API, since the previous one was deprecated.

Something that gave me some trouble during July was when I suggested to switch the CSV Parser API we were using because our previous one was deprecated.

The API’s purpose is to parse a CSV file containing recorded data.
Initially the challenge was to get the CSV parser to count how many “sensors” were inside the CSV file. Well…
Hold and behold. With the new CSV Parser the only necessary part of code is this:

csv::CSVReader csvReader(file_dir.toStdString(), csvFormat);
csv::CSVFileInfo fileInfo = csv::get_file_info(file_dir.toStdString());

bruh.

This still shows a huge lack of knowledge by me regarding how to read API documentations.

Finally, the last part of month two was featured by the introduction of Debug mode. 
Debug mode allows you to see when and where things are going wrong while your program is being executed. 

This is how it works: 
On the code edit mode, you can set breakpoints on the line counter on the left of the program.

I have spent most time of the month by refactoring (optimizing) my code, slowly adding UI functionalities to my program and discovering QT classes.

As of right now, I felt confident enough to just drop for a little bit of time my coding sessions.
I first put my hands on making a full inventory of all the laptops and docking stations that we have in the office.(btw docking stations are way more useful than I thought, especially if you have to take your laptop with you for a meeting)

To do a full inventory I have turned on each laptop, performed an hardware diagnosis and made a system info export that was afterwards uploaded on a Confluence page. 
The document featured a list with each laptop serial number, product number, basic hardware and charger info. 

Then, I focused on learning how to use the 3D printer we have in the office, a Creality CR-10S Pro v1. 

A 3D printer is used in such a way that you download a 3D model (for example from Thingiverse), and you use a dedicated software afterwards to converts it to a set of instructions that your 3D printer can interpret: the GCODE file format.
The 3D printer is not really away of how the end result is going to look like. 
It just knows how to move on its three-axis, the printing speed, temperature and other important settings that will vary depending on the level of quality of the final print and what kind of setup you have.
I expected 3D printing to be easier, but it actually requires you to sit down for a few days and learn how to properly calibrate it. 

Or weeks.

Well, me and another new guy wanted to perform some 3D printing tests, but the end results had plenty of inconsistencies. 
I am talking about stuff like this:

Image of 3D Printing Troubleshooting: Common 3D Printing Problems and Solutions: Gaps Between Infill and Outer Wall (Source)

On the right side of the print, you can see some parts not filled. We either got this problem or sections overlapping. 
While looking at the 3D printer on-screen menu, I mistakenly pressed the ‘Levelling’ setting’.

You’d assume to then access a menu with calibration settings, right?
You couldn’t be more wrong. 
This 3D printer is instead going to perform an automatic levelling test (distance between the muzzle head and the 3D printer bed).
Due to its previous non-standard configuration, the nozzle head ended up crashing against the printer bed, and caused the sensor to move.

Since I could not find any info in our internal matrix regarding such a situation, I decided to try things on my own by creating additional, new documentation explaining how to calibrate all the parts of our 3D printer.  
As of time of writing, it is split in these sections: 

  1. Gantry Frame Levelling
  2. Sensor Levelling – Part 1
  3. Sensor Levelling/Muzzle head adjustment – Part 2
  4. Bed levelling – Manual
  5. Bed Levelling – Automatic
  6. Muzzle temperature Calibration – Manual
  7. Speed calibration – Manual

Each of these components require specific and unique steps, which have been complemented with extremely high quality graphics made by me (© ®™) such as this: 


I am the Gordon Ramsay of art, but better.

In the end, the 3D printer calibration was successful. 
To better push my luck, I have tried printing multiple items in a single session. 
This is not a good idea because the 3D printer is taking care of one “entire” layer at a time, and 3D printing relies on material temperature manipulation. 
By printing the layer of one object, and then moving to a second object you are interrupting the current build. 
In the long run this will cause the final print to not be perfect, or even worse to completely screw everything up.

Apparently this is what happened during my last 3D print: some filament must have gotten stuck to the 3D printer head while becoming stuck, and crashed against the items that were being printed. 

I came back to the office the next day, I was welcomed with the 3D printer glass bed on the floor and a printing result that looked like it came straight out of “The Thing”.  

Going back into development, my tutor held a general OracleSQL course explaining how a database works and how you can interact with it (for example how to fetch data inside the database).

Knowing how to ‘communicate’ with the database was fundamental for my project and EventImport functionality, and it is overall good programming knowledge. 
Unlike C++, OracleSQL uses a different writing syntax. Something I find confusing is that they both use the same characters (for example –> ‘ )

Once again, I was surprised to see that QT has some sort of SQL integration through qSQL classes.
You can put SQL commands inside QStrings, and QT is going to handle the communication with the database.

It was interesting to participate in code reviews of my colleagues (mostly featuring my tutor’s code). 
Needless to say, even then I felt very overwhelmed by all of the code lines on the screen. It is also hard for me to read another person’s code (especially if without comments explaining the content) and understand what it does.

Close to the end of the month, only three things were left to do: 

  • Implement Event Import‘s communication with the OracleSQL database
  • Do as much refactoring as possible and split the program functionalities in three UI buttons
  • Create a Confluence introduction page of Event Import featuring the most common user-case of importing a .CSV RAW file. 

The tasks were completed on time, but not by much of the deadline margin. During the Event Import introduction I held in our department, the team responded well and expressed their interest in seeing it in action.

Final thoughts.

I am grateful for the level of teaching quality that has been provided by the company (and my tutor) during these three months of internship (arbeidstrening).

I am proud of everything I have been able to learn, but I am not satisfied with the end result that I have produced. 
It took me too much time to catch up with the topics I was studying, and my fear of ‘disappointing’ my tutor greatly altered my final performance.
It did happen a few times that I arrived late at work as a consequence of my fear stressing me out at home while I was supposed to be sleeping for the next work day.  
I have learnt how to manage this fear, and that it is okay to say “I need to slow down, I can’t follow up”. 
Or that I did not understand anything of a certain topic. 

Nether less, it is a great feeling to know that I can now make a GUI desktop application using QT, while interfacing it with SQL and with other third party libraries (such as the CSV parser I have used).
It gave a great boost on my CV and my professional confidence.  

I have been fed, taught and well-treated by my tutor during my three months permanence and I have now started an extra 6 weeks internship for a second project in the same company. 
Unlike the previous back-end project, this one shifted to pre-R&D. My objective is to record data proving how the lifespan of an in-house electronic device can be greatly extended. 

I am planning on writing a summary post for the second internship project and next time I will be more prepared through more detailed writing and notes.

Thank you R. and A. for being my teachers and aspiration on how to be a good developer. 
Having great teachers makes all the difference in the world when learning a new discipline.

Categories
Blog Technology

New light mode theme!

Several people told me to change the website design to light mode.

I gotta say, that was good feedback.
I also fixed my CV design a little bit and it looks better too.

For people that still want dark mode, there should be a “switch” icon on the bottom right of my website.
It might be moved inside the NAVBAR, I’m not sure yet. 

Categories
Blog Technology

Xiaomi Mi Watch (China version) & A brief history of recent smartwatches

Xiaomi is a Chinese company best known in the western world due to their fantastic smartphones and low prices. 
(They also sell a lot of different stuff in China)
Up to 2015, almost all low-end smartphones were plan awful. 

I am talking about the performance, the materials quality and overall user experience.

During 2016 an old friend of mine showed me his newly bought 250€ Redmi Note 3 Pro.  I couldn’t believe my eyes when I saw it. 

Photo from Techtablets.com

This is a short spec-sheet of the Redmi Note 3 Pro. You can see the full one over at gsmarena.com

  • An aluminum body
  • 1080P 5.5 inches IPS LCD display
  • Snapdragon 650
  • Dual sim, MicroSD slot
  • 16MP rear camera, 5MP front camera
  • 16GB 2GB/32GB 3GB RAM
  • 4050 mAh battery
  • Fingerprint scanner on the back

Rather than the solid spec sheet, what really surprised me the most was the battery length, the system optimization and the tons of updates that this phone received.
On the contrary, my LG G Flex received just one major update and that was it.
Yes, I was very pissed.
The LG G Flex was a premium phone with a launch price of circa 700€ (Since it was the  last one in stock I paid it 250€ in a local store), and as usual LG did not disappoint: it was abandoned shortly after.
I remember that in high school everyone had their eyes on it due to its unusual form factor, which looked like a banana.
Also, no one had any idea how to unlock it, since the button and volume keys were placed on the back cover and not on the sides.
The notification light was integrated into the power button, and could display several colors.
What is even more funny is that I previously bought the LG Optimus 3D Max, which shared exactly the same fate!
Luckily some divine-figure was kind enough to port Cyanogenmod to the 3D Max.
I was so impressed at how better it ran, and even the performance in games was night and day.
The stock rom (Android 2.3.6) ran titles such as Modern Combat 4 and Asphalt 7 at 30FPS, while CyanogenMod 10 (Android 4.1.2) ran both titles at a smooth 60FPS.
It brought justice to the phone’s hardware, and I was happy of that.
I sadly did loose the ability of recording 3D camera footage (I still have one 3D video uploaded over my channel), but it was not that much of a loss. 

Going back to my friend… the price of his newly bought phone dropped a hundred euros down in just 6 months.
Sorry, bud.
After discovering Xiaomi, it was just a matter of time before the rest of the avalanche finally hit: OnePlus, Huawei, Honor, Oppo, Meizu, ZTE, Vivo to name a few.
These companies released interesting phones and, I guess it is safe to say, stole a market percentage from the Big Ones (Apple and Samsung first).

Android’s strong point is being open source.
Because of that reason, a lot of interesting devices have been produced.
Here are a few ones:

On June 25 2014, the first Android Wear smartwatch was now available on the market:
The LG G Watch.

(Source: slashgear.com)

During Christmas 2016 I have bought one for me and another one as a gift to the same loser-owner of the Redmi Note 3 Pro .
5 years later I still believe that the LG G Watch is one of the best smart watches ever created.
The design is simple, elegant and proportionally pleasant to look at.

The watch is water-resistant, includes GPS and a microphone.
I remember using it all the time (Thanks Ma for gifting it to me!), mostly to reply to text messages and enabling timers.
And then I wore it all the time because of how stylish it was. 

Sadly Google/LG decided to kill it. The companion phone app does NOT push any app to the smartwatch anymore, notifications included.
Just… why? Why kill a product that always worked perfectly and that was reliable?
The answer is pretty simple: planned obsolescence… and the lack of a physical button.

Android Wear 2.0 (Then rebranded Wear OS) required a physical button or wheel to interact with the UI.
I understand that they want to add more features to the OS, but killing off prematurely the LG G Watch was a very bad idea.
It does not give a sense of confidence to new customers, especially in a market that was just born. 
Finally, the release price of the LG G Watch was around 200€, which is a fine amount.

If you are going to abandon something, at least make your code fully open source.
The companion app is closed source and only Google has control over it.
They purposely killed the LG G Watch and never looked back. 

Many other smartwatches were then released, but due to them using only half a GB of RAM the performance was not that great while using Android Wear. 

More customers were lost. And potential new ones just felt discouraged, so they never gave it a chance.

The only things keeping Wear OS alive are: 

  • Third party app support (APKs can be manually installed too through sideloading)
  • Google Assistant
  • Multi-Language Voice transcription working on the go, a feature I wished that BlackBerry smartphones had.

That’s it.
Apple is dominating the smartwatch market with the Apple Watch, a fully optimized smartwatch that perfectly (supposedly) integrates with the rest of the Apple ecosystem.
Since the Apple Watch only works with iPhone, many people are jumping off ship because there is no compatibility with Android or any other system.
To be honest, I have considered doing so too. 

The third biggest smartwatch operating system is Tizen OS, primarily developed and used by Samsung for their lineup of smartwatches.

Little personal fun-trivia: After further research, I discovered that Tizen OS is one of the successors of another operating system named MeeGo.
MeeGo was a Linux OS focused on low-computing hardware, and apparently it was used on a few laptops and phones. It did not go that far though, being discontinued only one year later its release.
The Samsung NP-100 was sold with this OS and I think that was a good idea: it was extremely stripped down and had a simple UI to accommodate for the low resolution displays.

Around 2015 I bought a Samsung NP-N150 from a friend of mine because it was small, light and featured one of the best keyboards that I have ever used. 

Sadly though, the hardware was extremely low-performance. 
You can’t really complain, as this laptop was sold Q4 2010 for a price of circa 400€.
These are the specs (Taken by notebookcheck.net):
Intel Atom N450 1.7GHz single-core
1GB RAM PC2
10’ 1024×600 display
250GB 5400RPM HDD
Wi-Fi 4, Bluetooth 2.1, UMTS Modem
0.3MP webcam, 48 Wh Lithium-Ion battery, 1KG weight

What you could do with it was extremely limited due to the low-range hardware. 
Booting up the system could take one minute, opening apps was a painful process and running more than one app than once could clog the limited 1GB of RAM available in the system.

Desperately, I tried putting an SSD inside running Puppy Linux, but the performance just was not good enough.
I could even have dealt with the sluggish speed of this laptop, but what killed the experience was the 1024×600 display. 
It just hurt my eyes. 
The working area of the screen was extremely small and it simply was impossible to work even over document writing.

The laptop does have several positive points though:
Extremely small and easy to carry around, a little bit over 1KG of weight
Elegant design and ergonomic keyboard
Almost inaudible CPU FAN, at only 30.7 dB(A) during heavy usage
Battery lasting 4 hours of web browsing with WLAN active

Somebody put an SSD inside and added an additional GB of RAM, with Windows 10 installed. The results are more surprising than I expected:

The Samsung N150 is a NETBOOK. Not a Notebook. NETBOOKs were laptops that focused over energy-efficiency and portability. Besides, around that era even normal notebooks had slightly better performance.
In 2010 you could have gotten a Sony Vaio with a 10’ screen and 1.9GHz single core Intel Atom N470 for 400€.
So right now Tizen OS is used by Samsung on its smartwatches, TVs, cameras and… a fridge?
Anyways I do not have any experience with Tizen smartwatches, so I will report what I have been reading around. The app support is terrible, but it has a better battery length compared to Wear OS. Bixby does not seem to be at the same quality level as Google Assistant.

Out of this Apple/Google/Samsung trio there actually are other smartwatches that use closed operating systems. 
They are good with the features that they are packed with, but that’s where it ends. They do not have any kind of store or third party support. Depending on your needs, this could be a deal breaker. 
I wish that Wear OS smartwatches looked as beautiful as the Huawei GT2 Pro. Instead almost all of them look clunky. The best (IMO) looking wearOS Smartwatches are the Skagen Falster 3 and the Fossil Gen 5.

Proprietary OS watches have the big advantage of battery length: they can last usually around two weeks of usage.
Almost all Wear OS devices last up to 1-2 days.
Recharging the watch so often is not worth the trade in the long run.

Also, there is no wearOS smartwatch that uses a full TFT panel for their display.
A TFT panel will allow an easy readability under direct sunlight without any form of backlight. 

I owned an Amazfit Bip for one year and I loved it.
Sure, it did not have any smart function at all, but it lasted 2/3 weeks, it counted my steps and most importantly told me the time at all times.

That is an ugly color. That's for sure.

Unfortunately after taking a shower the screen unglued and water went inside the shell, killing it. So… don’t do the same mistake I did!

After my Amazfit Bip’s death and the great experience I once had with my LG G Watch, I wanted to get a real smartwatch once again.

I fired up finn.no (Norwegian marketplace) and looked for used Apple Watches.
Most of them were around 200€, which was fine to me.
The problem is that Apple Watches only work with iOS.
And, unsurprisingly, there was no way to make it work with Android or my Hackintosh. 

Resigned, I remember that Xiaomi released an interesting Wear OS clone of the Apple Watch only for the Chinese Market in 2019.
Due to my love for square watches, it was love at first sight.
Curved bezels, AMOLED display and a functioning command wheel were looking great.
In the Youtube videos that I have seen the OS seemed responsive and smooth too.
Besides, this is a Xiaomi device.
Xiaomi to me is a seal of quality.
I own a Xiaomi Mi Mix 2S from two years and the UX is still going strong, I bought for my mother a 177€ Redmi Note 5 (and a Mi Band too), an electric razor for myself, bluetooth headphones, even the M365 Electric scooter.

So yeah, I do have some experience with this brand and I had no negative experience so far. 

I did a little bit of research and I found out that there is a European online store selling the watch for 125€: For such a ridiculous price, I had nothing to lose.
I ordered it and waited two weeks of excitement and anxiety. 

PACKAGE/HARDWARE

Needless to say: not only I was not disappointed, but I was positively surprised.
The box was elegant with a nice “overlay” printing of the watch, and on the back side there was a sheet with all the main functions.

Xiaomi is clearly not messing around.
The box content was pretty bare bone: Watch, Charger, USB charging cable (it is magnetic) and a small manual showing how to install the companion app on the phone.

I grab it up, but I notice that the battery was completely empty.
Time to wait for the longest 30 minutes of my life.
As soon as the Watch showed a sign of life, I instantly put it on my wrist and turned it on.
My first two reactions were “Wow” and “It is bulkier than I expected”.

Nonetheless, I was stunned by the building quality and high quality AMOLED screen.
The build quality is on-par with 300€ smartwatches, but at half the price! 

These are the hardware features of the watch (Taken from techandroids.com, click on link for additional details):

  • 1.78 inches AMOLED display with 368  x448 pixels resolution, 336ppi pixel density.
    Gorilla Glass 3 for the Watch Standard Edition, Sapphire Glass for Premium Edition
  • 1GB RAM, Snapdragon 3100, 8GB memory
  • Aluminum alloy Standard Edition, Stainless steel Premium Edition
  • NFC, WiFi, Bluetooth, eSIM (VoLTE supported), GPS
  • Running on MIUI for Watch (Reskin of WearOS)
  • Heart rate sensor with O2 Max support
  • Speaker and microphone
  • Rotating knob and a button

    (Insert video recording of rotating knub!)

Considering that this device was released on the Chinese market at the beginning of 2019, this spec sheet was (and still is) a very good one.
The smartwatch gives you a small haptic feedback upon rotating.
It feels pretty close to the JoyCon HD Rumble, or the HTC Vive vibration system.
I spent at least 30 minutes of my life enjoying the vibration feedback of my new smartwatch, it felt very satisfying. 

The touch response is good and the screen is visible in most situations.
The battery length lasts around 1 day with always display on, bluetooth connected, sleep tracking and mild chat usage.
The Telegram WearOS app works without any problem and I am able to send voice messages through the mic and even listen to them thanks to the built-in speaker.
Sadly I am unable to try out the eSIM support because my mobile ISP does not support them yet, but from what I heard from other users it kind of is a mixed bag.

Yet, it is perfect for people who might want to go jogging outside and not bring their phone with them.
In China it also is possible to use the watch NFC to pay for public transport tickets and I Suppose similar things.
Sadly NFC pay is not available anywhere else.

The already-applied screen protector was unexpected, but I did appreciate it in the long run: 

A perfect mix between a spider web and a painting from Picasso.
Should have gone to my uncle’s art school.

The watch does look slightly clumsy.

It might not feel like that much of a difference, but the design of a wearable device is fundamental. It has to look good.

The Mi Watch build quality is great.
It does not feel cheap. It once fell to the floor and there is no sign of damage or a single scratch whatsoever. I am still baffled about it.
It also is SUPPOSEDLY 5ATM Water Resistant.
I’ve read of people using it while swimming. I only used it while showering without any problem.

The included wristband is gummy and sturdy.
The grey color is a nice addition to the shell of the smartwatch.
Be careful while unmounting though, since the GPS antenna is located on the wristband attachment part over the shell.

SOFTWARE

The Xiaomi Mi Watch runs on a MIUI-Skinned Wear OS.
Since the watch is officially released in China only, the mounted Wear OS lacks functioning Google Services such as the Play Store, Google Assistant and Google Pay.
China uses the Great Firewall to regulate internet access inside the country, and has created in-house alternatives to the most popular Western apps, so it is nothing surprising.
There is an included App Store that is not localized in English, so are almost all downloadable apps.
The app count is no more than 50.
Almost all the apps that I have tried do not have the English language.
While browsing I even found a remote control app for Microsoft Power Point!

Almost all the stock apps are in English, and are the usual: calculator, timer, alarm etc.
The only problem though is that the default keyboard and Voice-To-Text are in only one language… did you guess which one? Yeah.
Luckily you can side load apps from PC, or from Android using Bugjaeger.
I find this name particularly hard to remember,
But it does the job well and is simple enough, so I’m not complaining that much.
I also would like to add that WearOS for some reason has problem recognizing multiple languages for Voice-To-Text.
I’ve seen this reported over the WearOS subreddit on other devices too.
Being a multilingual, this is a serious and frustrating issue for me.  

The included selection of Watch Faces look great and there are a few using the AMOLED energy saving mode.
Basically, each pixel of the display panel can be individually turned off.
So if for example there is a predominantly black background, most pixels will be off, thus saving some battery.
Other display technologies such as LCD are unable to individually turn off pixels, but on the contrary their lifespan is longer.

Some of the watch faces can be customized with different “quick buttons”. 

In order of appearance:
Step counter, heart rate and Telegram.

Telegram has a native app for WearOS and it works without a single hiccup.
You can listen to voice messages thanks to the built-in speaker, you can send voice messages, reply in chats and groups and send stickers.
Perfect for situations where you have your hands busy doing something else.

There are websites where you can download WearOS APKs and push them to the smartwatch afterwards.
One of the most popular ones is apkmirror.com.

A guy named Alberto created “Wear Store”, it is an installable WearOS app that includes a repository of downloadable WearOS apps and a few utility scripts, such as Xiaoai Remover (Xiaoai is the Chinese personal assistant included over the Mi Watch)
Wear Store can be useful for people that want the most simple solution to install applications over their Mi Watch, but the app catalog is too small.

The Mi Watch features an heart rate sensor that can also be used to track your sleep.
You can then see the data directly over the smartwatch or on the companion phone app Xiaomi Wear. 

There is a good variety of training presets that you can use to check/record your workout stats and I found the heart watch decently accurate. 

(Check difference from treadmill with sensors and smartwatch measurement)

Another two useful features are: 

  • Breathing exercises with visual and haptic feedback.
  • Get your ass up reminder – I invented the title but the concept is the same.
    It is important to take breaks while sitting in front of a computer for a long time and to keep your body active. 

WearOS will automatically somewhat recognize if you are doing any kind of exercise, by combining the gyroscope and heartbeat sensor.
It’s a cool feature to check how many calories you burn during the day.

The watch includes a secondary store that contains watch faces specifically designed for the Mi Watch.
There are some good ones, but unfortunately they feature Chinese text, which is not the ideal for non-Chinese speakers.

The Watch will use Bluetooth connection for data transfer by default, so installing apps/watch faces might be kinda slow.
To Switch to Wi-Fi, you can disable Bluetooth either on the phone or the watch itself.
Be warned: it will consume more battery.
In the workout app, the GPS is able to get locked in 1-2 minutes, and can last up to 2-3 hours of continuous use.

BATTERY

The battery lasts a minimum of 20 hours with Always-On Display, Bluetooth, Wi-Fi and sleep tracking active.
By disabling the Always-On Display, I’ve been able to get an additional 24 hours of usage (So a total of two days of use).
Once the battery is almost fully depleted, the smartwatch automatically goes in an energy saving mode, showing only the current time.
It also is possible to manually enable it from the quick-menu, and exit by pressing the power button on the watch.
It is in the norm of WearOS smartwatches, if not slightly better.

CHARGER

The charger can be connected to any USB outlet. It is magnetic and holds the watch in place once put in place.
Since the Mi Watch is a cheap smartwatch, I will let two defects slip by: 

  • The cable of the charging stand cannot be removed.
    This means that unless you have soldering skills, you will be forced to throw the charging stand away once the cable is broken
  • No rubbers on the bottom side. It is at a good risk of slipping and falling off the table.

SPEAKER/MICROPHONE

Not gonna lie, the quality of both devices surprised me.

CONCLUSIONS

This smartwatch could be so much more, but is instead limited by a company that wants to keep it leashed.
I understand Xiaomi not shipping the watch with the Google Services since it is a Chinese-market smart watch, but why not unlocking the boot loader?
I believe that when you buy a device you should have complete freedom over it.
Usually Xiaomi lets you unlock its phones, so that comes even more as a surprise.

Is this smartwatch worth the price?
Yes, but not if you want the complete Wear OS experience.
No Google Assistant, no integration with the Play Store, and many Wear OS apps that will not work when side loaded.

If your needs are just checking the time, sleep/exercise tracking and a few other things then I believe this to be the best smartwatch you could get for under 150€.

Categories
Blog VR

Grapple Tournament VR: a top-tier FPS game that deserves more players

It seems like the VR market is now at a stall in 2021.
We have seen the release of a good amount of VR games in these years, and it also proved that you indeed can profit by making VR games.

There are a few examples coming to my mind: Beat Saber, Pavlov and Half Life: Alyx.
(Yes, I know, you wanted a PC title instead… you said that at least 50 times). 

  • Beat Saber sold 4M copies, for an estimated $180M at the beginning of 2021. (Source)
  • Half Life: Alyx instead sold about 1 million copies, and helped selling 180,000 units of Valve’s VR headset ‘Index’ in just two months. (Source)
  • While I do not have economical info regarding Pavlov, it has an all time peak of 17,629 concurrent players at the time of writing this article (Source).
    Considering that Pavlov is an indie title I think that it is a pretty good result. They also recently released a WW2 themed update, featuring drivable tanks. I tried it and it’s an incredible experience.
    Wish I had friends to try it with though!
gif source: vrfocus.com

There are many more titles though that deserves more attention. 

One of them is Grapple Tournament VR.

This game is a mashup of Unreal Tournament and Quake but adapted for VR usage.
The title runs over Unreal Engine 4, and was released in PCVR early access (Basically beta) the 3rd of September 2020.
It also is supposed to be released the 11th of February 2021. 
Apparently Facebook is challenging Nintendo at being the slowest to approve titles over their platform.

The aesthetics are simple and pleasant. This means that the visibility and sight of other players during gameplay is never a problem.
The sound design is great. I do mean it, you clearly are able to understand what is happening around you thanks to the high quality of sound effects. Plus the main menu song is a banger. 
The music is so good that I already have a storyboard ready to be transformed into a short video, but sadly my PC is not powerful enough to record high quality in-game footage.

Besides, there is not that much to understand while playing such a game.
If it moves, shoot at it until it dies. ™

The game features a voice chat that is not dependent on in-game proximity and the coolest thing of them all: while you are waiting to respawn you are a ghost that can flip other people off.
It adds to the game atmosphere because it is exactly what you’d do in real life while playing CoD with your friends on the sofa.
And there is nothing wrong with that.
You get what you’d expect from any FPS Arena: A big arsenal of guns at your disposal.
You can only hold two at all times though, so you must be careful with that. Luckily there are several permanent weapon pickups in each map, and infinite ammo.
The main movement mechanic is the Grapple that you can use to fly all around the map. You can shoot it toward any surface and you will be pulled towards it.
Many people will probably not be happy about this, but you have to reload your gun when empty.
To reload, you simply move the empty gun towards the opposite side of your hip. Or you press the trigger button for an automatic process, but it will be slower and might happen at the wrong moment.

Ammo reload is part of the gameplay for a good reason: this is a VR game.
Not a PC one.
You cannot expect of doing the same crazy rocket jumps and flicks you’d do with KB/M (BTW greetings to my Warsow besties).
Not yet at least. VR Technology is not ready yet for that. 

The game maps are less than 10, but that is fine because:

  • The game is in early access.
  • The level design is in perfect symbiosis with the gameplay mechanics.
  • The art style is varied and each map looks different.
  • The maps are made for several game modes (Currently FFA, TDM and Capture Zones). 

For being an indie team, the developers are handling the game very well.

The game did contain minor bugs (Last time I played it was in December 2020, such as the voice chat occasionally not working properly.
Again, this is all to be expected since the game is a work in progress.
But the devs are active on the official Grapple Tournament Discord server, listen to feedback and always had a friendly and informal tone.

For the price of circa 13€ in Europe this game is a steal.
It is fun enough to play if you are solo queued, so I can’t imagine it with a group of friends. 

Because well… I have none!
Plus you will be supporting a small indie dev team building their dream game.

The game does have frame drops with a low-end PC (i7 7th gen, GTX1060 6GB, 16GB DDR4 RAM).
Sadly, that is the problem of using engines that focus on multi-platform compatibility rather than performance. 

There also is a problem though, that will hopefully be solved thanks to the Oculus version launch: No players are playing the game online.
Grapple Tournament had this problem since its launch.
This is not the fault of the developers though.
In my opinion they need to invest over marketing and promotional media material.
The promotional media’s quality is fine, but unless you pay money for a marketing campaign, your chances of gaining popularity are low.

Especially in a niche market such as VR Entertainment. 

As much as I disagree with Facebook’s policies regarding customer data, Oculus devices are affordable and cheaper than the competition.
They also offer a simpler solution for customers that would rather get an AIO system rather than a PC dependent one.
This is helping to break the niche-to-mainstream barrier. 

Images source: oculus.com

This is the perfect device for casual VR users.
It has its downsides too, though. The biggest one is that you will not be able to upgrade the hardware inside it.
Once an AIO VR headset becomes obsolete you will be forced to buy the next model.

With computers you simply can swap out a component and get a better one. (Obviously this does not work forever).
Not only that, but the graphical fidelity gap between an AIO VR and PCVR is impossible to close, due to the PC’s always evolving nature.
You do can play PCVR games on Oculus thanks to a data cable connecting the headset to a PC, but there will be latency added because it is a compressed video signal that has to be processed two times. Once from the pc, sent to the cable and then by the headset. 
Plus you risk of getting compression artifacts if there is not enough bandwith over the data cable.
This could be fixed by using the Thunderbolt 3 standard or USB 4.

For the love of God, please do not keep using confusing names for the USB standard.

Finally, I would also doubt the precision of built-in sensors compared to dedicated tracking hardware like the Vive or Index.

This is techie talk, and I do not want to stop people from having fun.
Grapple Tournament is a game that can both be enjoyed over PC and Oculus.
If you want to try it out, you can check the game official website here!