Category: dev

Topics loosely related to development and development environment.


Dell U4924DW vs U4919DW

(From a programmer point of view)

Dell has silently released the successor of U4919DW – the brand new U4924DW. I was looking for that upgrade for a long time and unfortunately I’m disappointed by this update. Here is why.

 
5 Kudos
Don't
move!

Fixing permission of files created from Docker

Docker requires root escalation in order to execute an image, that crates some problem with files creation. Let’s say that we share a volume from host to docker and we create a file structure from inside docker.

This can be illustrated by an code snippet

docker run --rm -w $(pwd) -v $(pwd):$(pwd) debian \
    bash -c "mkdir test && touch test/example"
# Running on host
ls -la test

 total 8
 drwxr-xr-x.  2 root   root   4096 Jan 22 22:50 .
 drwxrwxr-x. 12 trzeci trzeci 4096 Jan 22 22:50 ..
 -rw-r--r--.  1 root   root      0 Jan 22 22:50 example
# Running on host
rm -fr test
 rm: cannot remove 'test/example': Permission denied

Why this is even an issue? I’ve found this problem mostly annoying on local setup, as I need to use sudo for simple hause-keeping tasks. Another case when it’s very problematic is to use docker on Jenkins – as this prevents to remove workspace after a job is done.

 
81 Kudos
Don't
move!

Do you know #ifdef?

This time I would like to focus on some aspect that every C/C++ programmer is familiar with. That is preprocessor conditions. Before being crucified because of using #ifdef and C++ in the same sentence. I would like to confess, that this is still something frequently used.

What is #ifdef?

#ifdef is a preprocessor condition, that includes containing code whether condition predicate solves to ‘true’. It might be useful to make sure some code will be never compiled.

For the instance let’s see a code

void HandleResponse(const CHTTPResponse& resp) {
#ifdef WITH_CONTENT_VALIDATOR
if (!Validate(resp.content(CHTTPResponse::Text))) {
    ForwardCorruptedResponse(resp);
}
#endif
// ...
}

So far so good, let’s just compile our project with: g++ -DWITH_CONTENT_VALIDATOR=1 and see if everything works. It does. Sweet! No tests are required now, so let’s disable them by setting -DWITH_CONTENT_VALIDATOR=0 and check. Wait! My tests are still executed!

 
13 Kudos
Don't
move!

My first NPM package

Intro

This page describes my journey of creating and publishing an NPM package and reflections about this process.

I have chosen TypeScript as a development language for the chunked-call library. Basically it’s a 3 function library with ~70 lines of code, it’s nothing special at all. My ambition was to publish something in a right way and I was positively surprised about the process and what enforced me to make it right. Please note that this page is not a guide about pushing stuff to NPM registry or how to create an NPM package project in your language of choice. For those it’s always better to see an official documentation for either NPM or for your tool/language.

Some information here might be trivial for you if you develop on daily basis in JS/TS, to me as C++ developer they weren’t.

 

5
Kudos
Don't
move!


Thank you Adobe (Macromedia) for Flash

Google trends, Apple, Google Chrome and plenty of developers put a cross on Flash. In my opinion without Flash the current web tech stack might look different.

Credentials

I wrote my first line of code in ActionScript 2.0 it was 13 years ago and it was streamlined with the style of web. Big boom of flash animations, letters flying around and flash menus. In addition I’m putting myself as the worst person on the World in terms of color matching. At the moment of doing it I didn’t know that I become a programmer, I liked PC though.

A couple of years later I was doing more and more programming, some in Pascal, some in C. Neither of them attracted me for more time (before college) so that I was experimenting in Flash, and I enjoy a lot the simplicity of putting a movement to MovieClips, Timeline manipulation or doing mouse actions. During college, I’ve switched focus to C++98, Verilog and SystemC. Probably by accident I started to work in game industry at GameFactory, where I co-developed around 7 titles in Flash and 2 in Unity 4, then at King I’ve started to work as an AS3/C++ Engine developer. All of it doesn’t make me guru neither of language nor of the best practices. I achieved level where I felt comfortable with API and tech and I could utilize well that Flash offers,

Bright sides of Flash

API

I didn’t notice this aspect before, but after working as an engine developer I understood how hard is to provide clean API what is future-proof. As a noob I was able to deduce what some API call will do. For 8 year of working with Flash Player I don’t remember any problem with breaking changes. API was flexible enough to add new functionality, it was smartly designed around passing an extra configuration objects like LoaderContext. For the instance, when they added an asynchronous image decoding, it wasn’t done by an extra argument for function call, it was an extra property of context. KISS in practice.

ActionScript 3.0

I love in place XML:  var xml:XML = <foo><bar/></foo>;

I love Dictionary with weak keys, and Object where you can put other objects as a key.

I love typed Vectors, (And hate a little bit for weak performance even with fixed size, and conversion between them).

I love for each..in loop.

And I was so surprised that JavaScript has none of them. In such a way ECMAScript 4 (ES4) from ActionScript 3.0 is far more developer friendly than ES5 is. In someway ES6 tries the best by adding classes. But there is plenty of other missing features like: final classes, private, public, protected, internal accessors. Explicit inline (This is more compiler feature than language), strong typed (thankfully we have TypeScript), well designed Event System with nice propagation (It’s more like a library feature rather tan language), no confusion with undefined, no confusion with this, and static variables / functions.

 

217
Kudos
Don't
move!


Use CMake and Make, when sh.exe is in PATH on Windows

Problem

In order to be trapped by this problem your project / environment has to meet following conditions:

  1. You need to use Windows.
  2. Your project uses make as a base build system.
  3. You have available sh.exe as a system command.
  4. [Optional] You use CMake for a project generation.

Conditions 1 and 2 are pretty easy to fulfill, for the instance you try to compile Emscripten or Android based project. Condition 3 might look pretty odd. Why sh.exe on Windows? To me it was a natural ripple effect of having Git installed with Linux like tools in system PATH. I just love to use ‘ls’ instead of ‘dir’ in command line.

 

42
Kudos
Don't
move!


Windows 10 Creators Update and support of Hi-DPI and Low-DPI displays

This is an extension to my previous post about this problem: https://trzeci.eu/windows-10-support-of-hi-dpi-and-low-dpi-displays/

I’m right after install an update to Windows 10 Creators Update / 1703 and problem with scaling of some most applications has been solved by introduction new compatibility mode.

From the user perspective: It’s needed to set System (Enhanced) mode for DPI Scaling Behavior:

 

My low DPI Screen looks like below:

 

References

 

Update

After testing this for a couple of days I fount some glitches with Enhancement mode.

 

Windows Explorer

On LowDPI screen: moving location “segment” somewhere in order to link it.

View post on imgur.com

On HighDPI screen: Welcome window after installing Creators Update:

 

Other software what has some issues with enhancement mode.

VS Code

This soft works nicely without compatibility mode, but when I started to use ConEmu with Enhancement mode, it passes execution context to every application what is created from the console. Hence when I type code in my console it inherits settings.Then it looks like that:
HighDPI screen

This case applies on other applications, when improved compatibility mode is enabled.

 

 

4
Kudos
Don't
move!


2016 wasn’t the year of Linux for me.

From the beginning of 2016 I decided to move permanently to Linux as a primary system. I thought through decently this decision. So that I did a list of programs, tools that I use day by day on Windows.

 

Challenge 1: Find a stable and well supported Linux Distribution.

A list of choice was rather not so impressive: Debian, Arch and everything that bases on those. After few installations on a virtual machine, I decided to go in Ubuntu.

Installation itself was in like flynn, every device on Asus K95VM worked nicely.

Challenge 2: Customization.

First month I spent for making a system tailor made, mostly from visual and UX aspect. It’s amazing how far a system can be changed, also it was surprise how different is on Linux to install a video player that just works.

In case of development tools I fall in love to Terminator console emulator. ZSH+oh-my-zsh+terminator provide far better workflow than ConEmu+clink.

Challenge 2: Missing WebGL.

Firefox didn’t enable support for WebGL for my setup, although it’s pretty powerful. One change in Firefox’s settings and I’ve got support for it. This made me to think about update a graphic driver for my primary nVidia card. This was my first mistake. I did update and upgrade, then I navigated to a control panel of Additional Drivers and I selected then highest number. After this system didn’t start properly, and I spend half a day trying to restore it. Eventually I managed to downgrade to 340.96. Right now my laptop works with 367.57 binary driver, and even if I can select 370.28 I’m simply to afraid to do it.

Challenge 3: Support by other companies.

In this case Logitech. Even if mouse works nicely, there is no way to customize all mouse buttons. Somehow I manage to live without my custom settings. Unfortunately, it’s not my level to write my own drivers for it.

Challenge 4: Open/Libre Office.

As a free alternative to Microsoft Outlook, Libre office does amazing job. Literally in normal home-usage cases I haven’t find anything missing. Once I needed to use more advanced pivot table techniques in LibreCalc, I admit that we reached a limit. Don’t understand me wrong. Libre Office for home usage and probably in many cases for a professional usage is fine.

Challenge 5: Energy management.

K95 is not an example of mobile laptop I did few travels with him and I had to rely on embedded energy management. What I didn’t find much useful. I know that due a level of customization one can configure Linux to be very efficient, but from a noobie point of view there is no simple option that could simplify it. As a result of my incompetence and lack of tool, I didn’t manage to have more than 50% of the time that I could have on Windows.

Challenge 6: Multi screen configuration.

No surprises here, unless one of screen is set in portrait mode. In my case my GPU didn’t allow me to put a monitor to portrait mode. I’m not even talking about having a nice GUI that could allow to do it, in my case simple xrand didn’t work.

I found few cases that windows manager didn’t handle multi-screen configuration. It’s not uncommon that once a window is moved to another screen then the windows moves back to an original screen.

Layout manager for Unity/Ubuntu is not such useful like in Windows 10. It allows only to move a windows to right/left half and it’s always hardcoded 50%. It’s far better in case of i3wm or awesome, but this requires more time to learn.

Positive aspects.

Miscellaneous tools useful for development like: valgrind, sanitizers ltrace, strace are amazing.

System update works how it should work, so that I didn’t have to restart my system only because system update.

Early access to the newest compilers, so that it’s easy to learn new techniques (C++ especially).

System looks far better than any Windows, every step can be scripted, and due a convention of storing settings in ~ folder, it’s easy to reinstall system, and have an environment works rapidly.

 

Current setup

I didn’t uninstall Linux from laptop, it’s there still as a development machine, nevertheless where It’s needed better performance in a travel I use an other – windows based laptop. Also I found that Window 10 + WSL (Windows Subsystem for Linux) fulfills a missing part of lack of tools, so that it’s so far my configuration of choice.

 

 

 

4
Kudos
Don't
move!


Compile with WebAssembly on Windows

The base instruction is placed over http://webassembly.org/getting-started/developers-guide/ Unfortunately at this moment (17th of December 2016) It does not cover an instruction for Windows.

One option could be to use Windows Subsystem for Linux :) If this is not an option then remaining options are:

  1. Compile the latest Emscripten locally
  2. Use pre-compiled version

 

21
Kudos
Don't
move!


Doppler Effect removed from Chrome

In Chrome 55+ the function setVelocity has been removed. If your C++ game depends on OpenAL and somewhere you call:

alSource3f(mAlSourceId, AL_VELOCITY,

alSource3f(mAlSourceId, AL_SOURCE_RELATIVE, ...

Then you should either remove those calls, but if your game depends on AL_SOURCE_RELATIVE and you cannot remove it, then it’s required to add a simple snipped to your HTML page:

// A stub for missing setVelocity in Chrome 56+
try {
	if (typeof PannerNode.prototype.setVelocity == "undefined") {
		PannerNode.prototype.setVelocity = function() {}
	}
} catch (e) {}

try {
	if (typeof AudioListener.prototype.setVelocity == "undefined") {
		AudioListener.prototype.setVelocity = function() {}
	}
} catch (e) {}

It’s required due an underlying implementation that sets velocity while you call set source relative.

 

 

4
Kudos
Don't
move!