Monday, April 6, 2020

Better antialiasing on Windows Visual Studio Code

In Windows, Google Chrome browser suffers from font bad rendering, with fonts being too thin and washed on screen. I don’t really know the technical cause, but it seems related to antialiasing and how the fonts are drawn, maybe a DirectX Graphics misuse.

Visual Studio Code is built upon Electron infrastructure, which in its turn uses Chrome engine to render stuff. So, VSCode suffers from the same problem: fonts being too thin and bad to read. Writing source code in such an environment is hard on the eyes. Until this day, I simply used Consolas font, which is naturally thicker. But I was never satisfied.

On Chrome, I fixed the problem by using Font Rendering Enhancer extension. It’s a rather simple extension that just adds the following style everywhere:

* {
  text-shadow: transparent 0px 0px 0px,
    rgba(0, 0, 0, 0.5) 0px 0px 0px !important;
}

The variation occurs in the 0.5 value: the higher the value, the darker the fonts will be rendered.

At some point, I also started facing the same problem on Firefox, and I asked about it on Reddit. Then I used addon to apply the style globally, and the problem was solved.

Now, back to Visual Studio Code, I started wondering whether it would be possible to add a global style to the whole window, since it’s just a browser window, after all. Turns out it’s possible by directly injecting CSS into Developer Tools, but it will go away when you close VSCode. Now, to make this change permanent – at least until the next update –, we can edit the main CSS file of VSCode and inject the CSS snipped globally. The file is:

(install dir)
 resources
  app
   out
    vs
     workbench
      workbench.desktop.main.css

There’s a side effect, however: when opening the VSCode again, you’ll receive the following warning:

Your Code installation appears to be corrupt. Please reinstall.

What means VSCode checks its own files when it’s launched, and that’s good, given the amount of garbage that an Electron program has. You can ignore this warning though, although there’s a very remote risk that something bad was actually injected into your VSCode installation without your consent, and you’ll be vulnerable. But it would be a very rare event, indeed. You’ll also see “[Unsupported]” in the titlebar.

Wednesday, April 1, 2020

Install PKCS#11 token on Ubuntu 18.04

Firefox offers an graphical interface to add the PKCS#11 library to the browser, so you can use PKCS#11 token to authenticate in websites. Chrome doesn’t offer a GUI, so it must be done purely using command line in Ubuntu Linux.

After a few failed attempts, I finally found a recipe on how to properly do it. Although it’s aimed at Ubuntu 16, it works perfectly for Ubuntu 18.04:

An actual GUI on Chrome, just like Firefox has, would be great though.

Wednesday, March 25, 2020

Road Rash 3 guide

One of my favorite childhood games was Sega Genesis’ Road Rash 3. I ended up downloading Fusion emulator during corona virus pandemic, and of course I resurrected Road Rash 3, among others.

To my joy, I found a comprehensive guide for Road Rash 3, with amazing detail, which was finished in 2009, 11 years ago, by some good people. So far I’m having a lot of fun exploring it.

Monday, March 16, 2020

Choosing between useState and useReducer in React

Right now I’m designing a rather important architecture at work, and I’m using React for it. After writing a simple enough implementation with Redux, I came to the conclusion that, in fact, I don’t need Redux in this architecture, since I’m only storing auth information. Context API seems to be enough.

So, in order to have a mutable and reactive value in the application context, I must choose between useState and useReducer hooks.

While studying the matter, I found a rather good answer to this question:

  • When it’s just an independent element of state you’re managing: useState;
  • When one element of your state relies on the value of another element of your state in order to update: useReducer.

Although the examples given by the author are way too long, the idea is spot on. In my particular case, since the state is just a monolithic block of data, useState seems to fit my needs.

Wednesday, February 5, 2020

False memory leak reports of static objects

I was having a weird memory leak report in a C++ program, happening right after I close it, and triggered by a call to _CrtDumpMemoryLeaks, which exists in the very end of WinMain function in WinLamb. I was puzzled, because I’ve commented everything out, and I still had the memory leak.

Turns out _CrtDumpMemoryLeaks is called at the end of WinMain, before the static object destructors are called. And there you go: if any statically allocated object had made a heap allocation, the memory won’t be freed yet, thus the report.

I’m not the only one with this problem, but so far no solution had any effect. By now I’ll just avoid static allocation of objects which alloc memory on the heap, and carry on with life. Maybe I’m too used to the JavaScript blessings.

Thursday, January 9, 2020

What types are heap-allocated in Rust

Today I stumbled on this question regarding which standard Rust types do alloc in the heap. I have this question popping in my head quite often, so here are the heap-allocated ones:

  • Box, simple heap allocation;
  • Rc, reference counter;
  • Arc, thread-safe atomic reference counter;
  • collections.

Reference to the answer can be found here.

Monday, January 6, 2020

Firefox: can’t see menu separators in Linux

In Linux, I was having a problem when using Firefox. After some version update, the menu separator lines simply disappear. After searching around after a solution to this very annoying problem, I found another userChrome.css customization:

/* Make separators in menus easier to see */
menuseparator {
  -moz-appearance: none !important; /* nothing changes without this */
  background: #d4d2d1 !important;
  height: 1px !important;
  padding: 0 !important;
  margin: 3px 5px !important;
}

Make sure it’s loading is enabled. After restarting Firefox, the menu separators were back in all their glory.

Friday, December 27, 2019

Restore loading blue circle throbber in Firefox

Since Firefox 57 the loading icon has changed. Previously you’d see a blue circle spinning, now you see a dot moving horizontally. Personally, I prefer the old one.

So there’s this tip I found a while in the fantastic /r/FirefoxCSS Reddit, which restores the old throbber. Fortunately, Firefox developers kept the old animation file within the package, so we can still use them.

The following CSS must be added to “userChrome.css” file:

/* Revert tab throbber - for Nightly 57 as of 9/20/2017 */
.tab-throbber[busy]::before {
  background-image: url('chrome://global/skin/icons/loading.png') !important;
  animation: unset !important;
}
.tab-throbber[busy]:not([progress])::before {
  /* Grays the blue during "Connecting" state */
  filter: grayscale(100%);
}
@media (min-resolution: 2dppx) {
  .tab-throbber[busy]::before {
    background-image: url('chrome://global/skin/icons/loading@2x.png') !important;
  }
}

The “userChrome.css” is located in your Firefox profile folder. If it doesn’t exist, you can create it. Also, make sure it’s loading is enabled.

Thursday, October 17, 2019

Override Chrome policy in Linux

If you happen to have Google Chrome settings managed by your network administration, on Linux, the fixed settings are stored into JSON files in the folder:

/etc/opt/chrome/policies/

If you have write permissions, you can change the settings you want. You don’t even need to restart Chrome to the changes start working. This has been tested in Chrome 77.

Wednesday, October 16, 2019

Let Go website generate your documentation

When trying to figure out how go doc command works, I just found out that I don’t need to use it.

There’s an incredible feature of Go documentation website: it can generate and display the documentation of all your project, straight from GitHub – and other websites too. The generated HTML is very polished.

To use it, append your GitHub user name and repo to their URL, such as:

https://godoc.org/github.com/username/reponame

Even more interesting: all types and Go built-in types are automatically linked. And it also provides direct links to GitHub source files. On top of all that, it’s very fast. Written in Go, I suppose.

Being a C language admirer, the more I work with Go, the more I like its simplicity.

Wednesday, October 9, 2019

Using Go modules in separated local directories

Suppose I have a Go project, “foo”, which writes to the console. In this project, I have some .go files which have all the functions that actually write to the console.

Now I want to make these writing routines a separated module: “writer”, in another directory. I want two sibling directories: “foo” and “writer”. The “writer” will be used as a dependency within “foo”.

Within “writers” folder, run go mod init writer to create the go.mod file. Back in “foo”, edit its go.mod adding the new dependency:

module Foo

go 1.13.1

require (
  shoutergo v0.0.0
)

replace (
  shoutergo => ../shoutergo
)

The replace line will inform Go where to look for the module. Without it, Go will search in the internet, that’s why GitHub URLs work right away.

The version of the dependency, as far as I could find, is a Git tag, and to local modules it’s completely irrelevant, although necessary.

Now, in “foo”, we can import “writer” just like any other package:

import (
  "writer"
)

func main() {
  writer.SomeFunc()
}

As I keep learning Go and exploring the limits of the language, although I’m not entirely satisfied – lack of enums and namespaces –, I’m very pleased with its design choices with opted for simplicity. Feels like a better C.

Thursday, October 3, 2019

How Go caches downloaded packages

Here I intend to summarize how the Go package cache system works, after spending half of my afternoon running tests and figuring out this weird thing.

First off, to create a new Go project outside the awful GOPATH directory, you run:

mkdir my-project
cd my-project
go mod init my-project

This will create a go.mod file.

To add a dependency from GitHub, you run:

go get github.com/username/reponame

This will create a go.sum file, which contains the dependency tree. The package files themselves will be downloaded and buried within ~/go/pkg/mod directory, so they are effectively cached at global, machine-wide scope.

To list the packages inside my-project, run:

go list ./...

This won’t list globally downloaded, cached dependencies installed with go get.

To list the packages installed (not the cached ones) globally, run:

go list ...

Downloaded dependencies will be listed if you are in my-project folder, and if they have been downloaded already. If you run the command above from within a project directory, it will download and install any missing packages for current project, and then they will be listed.

So, if you’re outside my-project directory, there’s no way to list globally cached packages.

There’s no way to remove a globally cached package from cache individually. All you can do is delete the whole cache, with:

go clean -cache -modcache -i -r

Tuesday, October 1, 2019

CSS grid with column flow, with a nested grid

This month I was trying to layout a very complex form in two columns, and I ended up with this CSS sorcery. It’s important to notice that the number of columns and rows must be tightly controlled via their widths and heights.

Friday, September 20, 2019

The joy of Git Submodules

I’ve been using Git Subtrees for more than two years to manage the dependencies of my projects in Git. Today I found this article explaining Git Submodules, and I realized that I had it all wrong. Submodules suits my needs much better.

I finished migrating my C++ repositories which have WinLamb as a dependency. The nested “winlamb” folder effectively acts as a separated repository, without interfering with the top one. No more annoying merges with a huge hash as the commit message, when updating the library.

Monday, September 16, 2019

Rust for C++ programmers in 30 minutes

From time to time I get back to studying Rust, which looks like a good alternative to the unthinkable complexity of C++ for native programming, which even after about 20 years, still upsets me tremendously. From the perspective of a seasoned C++ programmer like me, the Rust concept of lifetimes has been particularly esoteric.

Fortunately, I found a great resource online today:

30 minutes of Introduction to Rust for C++ programmers

It’s a very concise online book with direct comparisons between C++ and Rust codes, exactly what I was after. It explains Rust basic concepts by direct comparison to C++, what greatly helps. Although you’ll need a little over 30 minutes to properly digest it, it’s well worth reading, and I consider to be the greatest introductory material so far to C++ programmers who want to dig into Rust.

Props to vnduongthanhtung, who authored the book back in 2017.

Monday, September 9, 2019

A new custom gauge for the backbowed Majesty

I’m having some trouble while setting up my new Music Man Majesty. It seems that Music Man applies some kind of pre-tension to the mahogany neck so it backbows, to counterweight the .010 strings that come stock with the guitar. Looks like a bad design decision to me, I wonder: isn’t it what the truss rod is for?

Since the guitar is hard-set to .010 gauge, my custom .008 is causing a strong backbow, with the 5th and 6th frets buzzing like crazy in all 6 strings, even with the truss rod completely loose. But I’m really enjoying the neck profile and the overall feeling of the Majesty, so I’m trying to work it out.

My current gauge is .008 .009 .011 .021 .030 .038, which I use in the Ibanez JPM and the Suhr Modern Satin without any problems. The Suhr setup is particularly perfect.

So yesterday I rescued the two heavier strings from the .009 D’Addario set I had thrown into the trash bin, and now I’m trying .008 .009 .011 .021 .032 .042 on the Majesty, with the hopes that the heavier strings from the .009 set will pull the neck forward and alleviate the backbow.

Plot twist: A couple weeks later, measuring the neck relief, I found out that the neck wasn’t backbowed, but very close to straight. The real problem was, probably, a raised 7th fret, which made the 6th fret unusable. Being an expensive instrument with stainless steel frets, I found it to be unnaceptable.

Tuesday, July 2, 2019

Goodbye Eclipse

I received my ESP Eclipse II Silver Sparkle in February 14 of this year, as part of my Les Paul craze. Today, almost 5 months later, I posted it on the mail after selling it out.

It’s a bit sad, because it was a great guitar. Way more comfortable than my previous Gibson Les Paul Studio, which I had back in 2014. The neck felt very comfortable, but it helped me understanding how I prefer flatter neck radiuses. The ESP has a 12” fretboard, which felt a world of difference from my Suhr, which is close at 14”. The ebony fretboard was very smooth, but I missed the stainless steel frets. All that not mentioning the incredible looks of this guitar, shiny all around – one of the main reasons that made me buy it.

This ESP had an EMG 81 in the bridge, and an EMG 85 in the neck. I swapped them, and the guitar sounded much more balanced. The cleans were beautiful, but somewhat overcompressed, it was hard to tweak a proper clean tone for rhythm parts.

This ESP had the D string slot very low, the open D was buzzing. I played my sole gig with this guitar having the nut like that, improvising paper shims inside the nut slots. I replaced this nut with a new bone nut soon after.

In the sole gig I played with it, in March 23, it felt very heavy on my shoulder. Also, it made me do a lot of mistakes, probably because of the different position the Les Paul shape puts you in, and the rounder fretboard radius. Since then, I played no other gig. And I realized I’m not playing it anymore. Saddened, I decided to sell it. And it was gone today. And I must say, despite everything, I miss it.

Now, I hope my Les Paul craze go away.

Thursday, June 27, 2019

Personal key YouTube page links

Once logged in, these links will take you to key YouTube pages:

/comment_history Comments you wrote.
/my_liked_videos Videos you liked.
/my_videos Videos you uploaded.
/subscribers People who subscribed to your channel.
/subscription_manager Manage the channels you have subscribed to.
/view_all_playlists Playlists you created.

Sunday, June 16, 2019

The weight of my guitars

It finally happened.

After an awful amount of time wondering, I finally managed to temporarily steal a precision weighing scale from my girlfriend’s kitchen, and finally find out how much my guitars weigh. Here are the results of my current guitars, updated:

Year Model Weight (kg) Weight (lbs oz) Weight (lbs)
2012 ESP Eclipse II silver sparkle 3.75 kg 8 lbs 4 oz 8.25 lbs
1992 Ibanez UV7BK 3.63 kg 8 lbs 8 lbs
1997 Ibanez JPM P2 3.52 kg 7 lbs 12 oz 7.75 lbs
2014 Music Man JP6 silver sparkle 3.45 kg 7 lbs 10 oz 7.6 lbs
2016 Music Man Majesty arctic dream 2.95 kg 6 lbs 8 oz 6.5 lbs
2013 Suhr Modern Satin natural 2.77 kg 6 lbs 2 oz 6.11 lbs
2023 Ibanez Q52PB 2.17 kg 4 lbs 13 oz 4.78 lbs

I actually tought the JPM was lighter, and the Eclipse was heavier. The Modern Satin is, indeed, a very lightweight guitar.

The JP6 silver sparkle was said on Reverb to weigh 7 lbs 14 oz, or 3.57 kg, which was actually wrong.