s
Blogs
Since I started to follow the rising popularity of board games, 15 years ago, one game the games that was recurrently recommended is Pandemic, designed by Matt Leacock. When I finally had the chance to buy a game from US, it was one of the 4 games I’ve got.
At the prestigious BoardGameGeek’s top ranked games, Pandemic figured in the top 10 games for quite some time. Now the Legacy version is currently in the top 3.
The main attractive at the time is the idea of a cooperative game. All players fight against the game itself. On video games its common, but was kinda a novelty for tabletop games. It plays well with 2 to 5 people and you can even play with children, because it’s all information is open so you can help the decisions for each player. Also because of been cooperative, it’s very easy to teach other people, because you can teach and repeat the rules while playing.
The let’s Save the World from a Pandemic theme was already fun, but now it has an almost historical and technical value to it. The game popularity spawned several expansions, spin offs and the most successful Legacy series, the campaign story-drive version.
It’s my most played board game to date. For a reason.
I continue to read (listen in fact) almost every day for the past years. It’s in my daily routine when I walk the dogs. It’s a very different proposition from laying down and dedicate some time to read them. I have an urge of a secondary task when I am performing a no-brainier routine, just as.. walking the dogs. Otherwise, I just feel wasting my time my just walking and no thinking.
This is the list of this year’s books that I ingested. Later I present a list of books from the previous years that did not mention before. These lists are -definitively- not comprehensive ones. Since I’m not updating my GoodReads personal records nor writing about them in this blog, they are just the ones I remembered. Eventually I might edit this post in case I remember other entries.
For more books, you can check my online read list on GoodReads.
Hugo static website creating is a fantastic tool and I told you before. Since I changed to it, I’m very confident that the site is fast and responsive.
However, my site is packed full of images. Some are personal. Some are huge. Some are PNGs and some are JPGs. I created a gallery component just to handle posts that I want to fill with dozens of them.
Managing posts images is a boring task. For every post, I have to check:
Having a bigger image than the size of the screen is useless. It’s a bigger file to download, consuming bandwidth from both the user and from the server. Google Lighthouse and other site metric evaluators all recommend resizing the images to at most the screen size.
In Hugo, I’ve automated using some functions:
{{ $image_new := ($image.Resize (printf "%dx" $width)) }}
My personal photos are, most of the time, taken in JPEG. Recently I changed the default compression to HEIC for my phone camera, that provides better compression to hi-resolution photos. The web, however, does not allow such format.
Some pictures used to illustrate the posts are PNG. They have better quality at the expense of being larger. Mostly only illustrations and images with texts are worth to have a lossless format.
Whatever the format, I would like to compress as much as possible to waste less bandwidth. I’m currently inclined to use WebP, because it can really shrink the final size to a considerable amount.
{{ $image_new := ($image.Resize (printf "%dx webp" $width)) }}
Each digital image have a lot, and a mean A LOT, of metadata embedded inside the file. Day and time when it was taken, camera type, phone name, even longitude and latitude might also be included by camera app. They all reveal personal information that was supposed to be hidden.
In order to share them in the open public internet, it is important to sanitize all images, stripping then all this information. Hugo do not carry these infos along when it generates new images. So, for all images get a minimal resize, this matter is handled by default.
I would like to have a well organized image library, and it would be nice to standardize the file names. Using the post title to rename all images would be great, even more if used some caption of user provided description.
However, Hugo does not allow renaming them. To make matters even worse, it appends to each file name a hash code. A simple picture.jpeg
suddenly became picture-hue44e96c7fa2d94b6016ae73992e56fa6-80532-850x0-resize-q75-h2_box.webp
.
An incomprehensible mess. If you know a better way, let me know.
So, if most of the routines can be automated, that’s the problem?
The main issue is that Hugo have to pre-process ALL images upfront. As mentioned in the previous post, it can take a considerable amount of time. Especially if converted to a demanding format to compute such as WebP.
Netlify is constantly reaching the time limit to build the site, all because the thousands of image compressions. I am planning to revert some commits that I implemented WebP and rewrite them little by little, allowing Netlify to build a version a cache the results.
There are some categories of images:
I will, in the next couple of hours, try to implement the WebP code on each of these groups. If successfully completed, it will save hundreds of megabytes in the build.
Hugo copies all resources (image, PDF, audio, text, etc.) from the content folder to the final public/ build. Even if you only use the resized ones. Not only the build becomes larger, but the images that you wanted to hide the metadata is still online, there. Even if not directly pointed in the HTML.
A tip for those that are working with Hugo with a lot of images processed: use the following code into the content front-matter to instruct Hugo to not include these unused resources in the final build.
cascade:
_build:
publishResources: false
Let’s build.
I discovered that Netlify has a plugin ecosystem. And one of the plugins available is a Hugo caching system. It would speed up drastically the build times, as well the possibility of converting to WebP all images once and for all. I will test this feature right now and post the results later.
The plugin worked! I had to implement it using file configuration instead the easy one-click button. Building time went from 25 minutes to just 2. The current cache size is about 3.7 GB, so totally understandable.
It will allow me to must more frequent updates. Ok, to be frank: it will not restrict the posting frequency. However, patient, inspiration and focus are still the main constrains on blogging.
On netlify.toml
file on root, I added:
# Hugo cache resources plugin
# https://github.com/cdeleeuwe/netlify-plugin-hugo-cache-resources#readme
[[plugins]]
package = "netlify-plugin-hugo-cache-resources"
[plugins.inputs]
# If it should show more verbose logs (optional, default = true)
debug = true
For the last 9 years, I work as a planner and controller of a multinational Brazilian oil company. The team consolidates all the planning information of the whole company, analyses it, and reports to the company board of directors.
For all these years, I’ve struggled to deal with some basic business scenarios:
The current information systems used or developed by the company are too restrictive to accommodate their business cases. The general solution is to create entire systems using dozens of spreadsheets. It is a patchwork of data, susceptible to data loss and zero control.
To address this, I decided to develop, on my own, a new system that is both flexible and powerful. The overall core propositions are:
With this feature set in mind, I started to create a spear time what is now temporally called Project Curva for the last 3 months. I will post more about it in the future: the used technology, the technical challenges, and some lessons learned.
A beta is due at the end of April 2021.
The project is called NiwPlan and can be checked on NiwPlan.com.
When you read this post, you probably already know: the Cyberpunk 2077 hype did not pay off. However, I would like to explore some personal insights.
As a Role Playing Game, you are someone else. A player might spend one full hour just tweaking the characters’ appearances, hair, weight, and eyelashes. Then calmly considering spending the scarce points on each attribute. One is not creating himself/herself, but a different being. Maybe a projection or simply experimenting with unique approaches.
Then the game starts.
You barely see yourself on the screen.
Shooters are much easier to do in first-person. CDPR said they opted for the first-person approach as part of the vision that the player should feel he is indeed there. They even removed some features of the game because it was not working well in the first-person.
But as I said before, since one spent so much love creating the character, it would be a wiser decision if one would see it more often. A third person would be a better decision. It was more valuable to see the custom V fighting than was seeing Geralt’s.
The result is that I have never really connected to the character that I created.
Also, there is a second take on character creation that is unique to Cyberpunk 2077 universe: augmentations and down-the-line customizations. A game advertised as being open regarding your physical appearance, it was noted by many the lack of visual modification during the game. Not even changing the hairstyle, present in a much less relevant The Witcher 3, was absent.
Clothing functions as both technical improvements and fashion. The game could embrace the idea each piece of clothing could have any game element or bonus. It would encourage players to find their style instead keep mixing weird styles just to get specific bonuses.
The game was plagued by technical issues. There are hundreds of videos on YouTube with hilarious situations. CDPR had to reimburse many players, and it was removed by the PlayStation Store days after the release, due to the impossible state!
I had no crashes but a ton of buggy behaviors. Citizens’ reactions, random explosions, and enemies’ misbehavior. In some critical emotional moments, a bug can spoil the fun. I finished the game trying to do ALL the achievements. But one was impossible to achieve due to a bug in a side mission.
Then cars… The Witcher’s horse, Roach, was a delicious surprise and set the benchmark to address rideable in video games. Just before launch, Geoff Keighley (one of the few people that tasted it at the time) said driving was super satisfying. The cars felt so bad. Driving was a burden. Felt like balloons, weightless. Bikes are even worse.
I was hoping to drive like a vagabond, exploring each inch of the city. But instead, I was using teleportation all the time.
The pace that the fixes were coming was also much desirable. I finished the game in 3 months, but some patches were released back then. CDPR always had a top-in-industry attitude regarding enhancing their games after release, but this time I believe they are subpar.
At the very beginning, you have to choose the background story. There are 3 possible starting conditions. And the first act considers this choice important, pointing to it frequently.
Then it becomes irrelevant. The mid-game is a generic Ubisoft open-world game or GTA. V is on a brink of death, but the game’s open-world nature let her have romantic relationships, racing, and help other people that, frankly, could wait until you solve your most significant issue.
While not very original “there is a dude inside your head”, their take is unique and grounded. However, CDPR opted to use other very boring tropes like “He was supposed to die, but he miraculously survived”. No need to put a bullet in V’s head to wake her up in the next scene.
The mid-game is an “ensemble a killer team” theme. It was nice but the team and the final mission are less like Ocean’s Eleven and more like The Avengers: group a team of 3 guys and storm into the castle. A good point is the insertion of several recurring characters in side missions. From love affairs to super AI or ex-cops, the player starts to care about them after some time.
The final orchestrated act was also lacking due to a single biggest factor, IMHO: there are no good villains. A good villain has to be seen, tasted, and feared often. If you show Adam Smasher only once, 50 hours late you could not care less about him. The other Arasaka family members are the same.
Think about the great movie and video game villains. They have a considerable amount of screen time, so the viewer has the chance to witness his evil intentions. Darth Vader, Joker, Glados, LeChuck, Ganon, Bowser.
A very good aspect of the story is the cultural references and jokes. More than once, I was caught laughing out loud with some of them.
As one of the first games I have ever pre-ordered, I must say that knew what was coming. If I waited for some reviews first…
Cyberpunk 2077 is an ambitious project and several parts of it show it. However, despite the strong beginning, it becomes a generic open-world game with amazing graphics.
I finished the game and most of the achievements. 100+ hours on it. Yet, I feel disappointed. I even may get back to it in a couple of months or years, with extra content and numerous enhancements.