Performance of native ES2015 promises and ES2017 async functions in Node.js v8

Platform info:

  • Windows_NT 10.0.15063 x64
  • Intel(R) Core(TM) i7-3667U CPU @ 2.00GHz × 4

Async types tested:

  • Bluebird Promises = Bluebird 3.5.0 Promises
  • Native Promises = ES2015 Chrome V8 Promises
  • Async functions = ES2017 Chrome V8 Async Functions

Benchmarks:

  • Doxbee sequential
  • Madeup parallel

Doxbee sequential

./bench doxbee

Performance of Chrome V8 Promises in current versions of Node.js

Node.js LTS Chrome V8 Time, ms Memory, MB
v4.8.4 Argon 4.5.103.47 1433 185.33
v6.11.2 Boron 5.1.281.103 1468 141.76
v8.4.0 + util.promisify (Carbon) 6.0.286.52 730 61.86

Notes: performance of native promises in Node.js v8 improves by a factor of 2 with memory utilization dropping by a factor of 2.3-3.0 in comparison with the previous versions of Node.js.

Performance of Callbacks vs Promises vs Async Functions in Node.js v8

Node.js v8.4.0 (Carbon) / V8 6.0.286.52

Async Type Time, ms Memory, MB
Callbacks 161 33.54
Bluebird Promises 372 41.32
Async functions + Bluebird promisify 583 72.79
Native Promises + util.promisify 730 61.86
Async functions + util.promisify 743 79.89

Notes: native ES2015 Chrome V8 promises in Node.js v8 perform roughly 2 times slower than Bluebird promises using 50% more memory. In contrast, native ES2017 async functions in Node.js v8 perform only 30% slower than async functions with Bluebird promisify using roughly the same amount of memory.

Madeup parallel

./bench parallel

Performance of Chrome V8 Promises in current versions of Node.js

Node.js LTS Chrome V8 Time, ms Memory, MB
v4.8.4 Argon 4.5.103.47 3269 496.14
v6.11.2 Boron 5.1.281.103 3156 447.39
v8.4.0 + util.promisify (Carbon) 6.0.286.52 1274 195.23

Notes: performance of native promises in Node.js v8 improves by a factor of 2.3-2.5 with memory utilization dropping by a factor of 2.1-2.6 in comparison with the previous versions of Node.js.

Performance of Callbacks vs Promises vs Async Functions in Node.js v8

Node.js v8.4.0 (Carbon) / V8 6.0.286.52

Async Type Time, ms Memory, MB
Callbacks 376 73.55
Bluebird Promises 600 106.58
Async Functions + Bluebird promisify 636 114.67
Async Functions + util.promisify 1247 202.34
Native Promises + util.promisify 1274 195.23

Notes: both native Chrome V8 ES2015 promises and ES2017 async functions perform roughly 2 times slower than Bluebird promises using almost 2 times more memory.

Conclusion

Node.js v8 comes with significantly improved performance of native ES2015 promises and ES2017 async functions, further boosted by the introduction of native util.promisify.

Air Quality in Tallinn, Tartu, Narva, Kohtla-Järve

The International Agency for Research on Cancer (IARC) has classified outdoor air pollution as a cancer-causing agent (carcinogen). The IARC is part of the World Health Organization (WHO), and is one of the primary sources for information on cancer-causing substances. In its evaluation, the IARC concluded that outdoor air pollution causes lung cancer and is also linked to an increased risk for bladder cancer.

WHO Europe and OECD have released a report on the economic cost of the health impacts of air pollution in Europe. US$ 1.6 trillion is the economic cost of the approximate 600,000 premature deaths and of the diseases caused by air pollution in the WHO European Region in 2010.

At the same time, Estonians are breathing easier than most people in the world, ranking first in an-air quality index released by the WHO. Estonia topped the list with the best air quality.

Now for the first time, using our Garage48 project, residents of Estonia can see in real time air quality in Estonian cities of Tallinn, Tartu, Narva, Kohtla-Järve and decide for themselves whether it’s a good time to go for a run, ride a bicycle or walk with a kid in the city centers.

Please check out Air Quality in Tallinn, Tartu, Kohtla-Järve, Narva - Visual Air and provide feedback via the Visual Air Facebook page.

Анонімізатор повідомлень про корупцію XabarDocs

Шановні журналісти, розслідувачі та потенційні інформатори про факти корупції!

Повідомляємо про старт антикорупційного інструменту XabarDocs. Мета XabarDocs:

  • забезпечення анонімності інформаторів
  • полегшення збору матеріалів про корупцію
  • розширення доказової бази антикорупційних розслідувань

XabarDocs заохочує громадян викривати корупційні справи і посилювати боротьбу з корупцією, забезпечуючи повну анонімність інформаторів.

Світова практика використання аналогічних інструментів доводить їх високу додаткову вартість у розширенні доказової бази проти корупційних справ і збільшенні кількості публікацій у медіа. (Журнал “Wired” від 30 грудня 2013 року)

Аналогічні інструменти використовують такі видання як The New Yorker (Strongbox), Forbes (SafeSource), Zeit (Briefkasten), Al Jazeera (Transparency Unit), а також інституції Європейського Союзу, такі як Управління з питань запобігання зловживанням та шахрайству (OLAF), а також журналістські платформи Голандії (Publeaks), Сербії і Болгарії (BalkanLeaks), Іспанії (Fíltrala) та Італії (MafiaLeaks).

Реалізація XabarDocs в Україні стала можливою завдяки ефективній кооперації Українського Інституту Публічної Політики (УІПП) із Талліннським Технічним Університетом (TUT) та за фінансової підтримки Міністерства Зовнішніх Справ Естонії.

Nodemon in Node.js / io.js projects with ES6 / ES7

If for some reason you don’t want to use Grunt or Gulp in your Node.js / io.js project utilizing ES6 and ES7 (ECMAScript 6 and 7) features, you can configure automatic Traceur compilation with nodemon:

  1. install Traceur Runner (Traceur will be installed automatically as a dependency):

    1
    npm install -g traceur-runner
  2. force nodemon to use Traceur Runner for all JavaScript files and to watch for changes in js, json, html, css files by creating nodemon.json file:

    1
    2
    3
    4
    5
    6
    {
    "execMap": {
    "js": "traceur-runner"
    },
    "ext": "js json html css"
    }

Now it is possible to develop and run Node.js / io.js projects utilizing ES6 / ES7 features using nodemon with automatic traceur JavaScript.next-to-JavaScript-of-today compilation on the fly.

Basic WordPress Multisite Network config for nginx with php-fpm

A starter working config combined from nginx and WordPress sites to provide initial configuration starting point

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
user www www;
worker_processes 1;
events {
#worker_connections 1024;
}
error_log /var/log/nginx-error.log;
http {
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 64;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;
gzip_types text/plain application/xml text/css text/js text/xml application/x-javascript text/javascript application/json application/xml+rss;
upstream php {
server 127.0.0.1:9000;
}
map $http_host $blogid {
default -999;
#Ref: http://wordpress.org/extend/plugins/nginx-helper/
#include /var/www/wordpress/wp-content/plugins/nginx-helper/map.conf ;
}
server {
server_name example.net *.example.net ;
access_log /var/log/wordpress.log;
root /home/www/wordpress;
index index.php;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
try_files $uri $uri/ /index.php?$args ;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass php;
fastcgi_param SCRIPT_FILENAME /home/www/wordpress$fastcgi_script_name;
}
#WPMU Files
location ~ ^/files/(.*)$ {
try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1 ;
access_log off; log_not_found off; expires max;
}
#WPMU x-sendfile to avoid php readfile()
location ^~ /blogs.dir {
internal;
alias /home/www/wordpress/wp-content/blogs.dir;
access_log off; log_not_found off; expires max;
}
#XML Sitemaps - Yoast WordPress SEO
rewrite ^/sitemap_index\.xml$ /index.php?sitemap=1 last;
rewrite ^/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
#add some rules for static content expiry-headers here
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
}

Building Rackspace Cloud Monitoring Agent on FreeBSD 10

Below is how we managed to build Rackspace Cloud Monitoring Agent on FreeBSD 10:

1
2
3
4
5
6
7
8
9
10
11
12
13
pkg install git
pkg install gcc46
git clone https://github.com/racker/virgo
cd virgo
git submodule update --init --recursive
./configure
setenv CC gcc46
setenv CXX g++46
setenv CPP cpp46
gmake -C out
gmake install
cp base/pkg/freebsd/rackspace-monitoring-agent.init /etc/rc.d/rackspace-monitoring-agent
chmod 755 /etc/rc.d/rackspace-monitoring-agent

Громадська Конституційна Ініціатива

Політичні кризи, що призвели до Євромайдану та Помаранчевої революції, відбуваються як реакція суспільства на фактичну узурпацію державної влади президентами України.

Можливості для такої узурпації є наслідком недосконалості чинної Конституції України від 1996 р, згідно якої Україна є змішаною президентсько-парламентською республікою з президентом, що має надзвичайно широкі повноваження. Так президент:

  • обирається на 5 років і практично не може бути достроково відсторонений від влади шляхом імпічменту
  • контролює виконавчу гілку влади, включно з призначенням та звільненням Прем’єр-міністра України, членів Кабінету Міністрів України та голів місцевих державних адміністрацій
  • призначає за згодою Верховної Ради генерального прокурора

Враховуючи необхідність реформ в найкоротший термін після обрання нового президента, першочерговим завданням є запровадження механізму, який унеможливить в майбутньому подібну узурпацію влади однією особою.

Аналізуючи сучасні політичні устрої успішних європейських країн, ми можемо запозичити їхній досвід для створення вдосконаленої системи влади в Україні.

Одним з фундаментів такої системи є парламентська форма правління, яка успішно існує у більшості країн Європи. Ця форма правління являє собою універсальний та діючий механізм врахування інтересів громадян і забезпечення принципу стримування та противаги. За парламентської форми правління виконавча гілка влади (Кабінет Міністрів) призначається та відправляється у відставку парламентом, а не президентом. Таким чином повноваження президента - суттєво обмежені, що значно ускладнює узурпацію влади однією особою.

Надзвичайно важливою є пряма демократія у вигляді референдумів за ініціативою громадян, що повністю відповідає сьогоднішньому духу Євромайдану. Така система успішно діє протягом майже двох сторіч у Швейцарії. За цією системою громадяни можуть як ініціювати зміни до діючою конституції, так і безпосередньо скасувати закони, які були прийняті парламентом. Водночас, державні посадові особи не мають повноважень, що можуть привести до блокування таких референдумів або спотворення їхніх цілей.

Враховуючи все вище викладене, з метою запобігання подальшій узурпації державної влади та беручи до уваги інші недоліки у системі державної влади в Україні, пропоную створити робочу групу для розробки проекту змін до Конституції України з розглядом наступних питань:

  1. запровадження парламентської форми правління
  2. децентралізації влади шляхом ліквідації інституту місцевих державних адміністрацій і передачі їхніх повноважень місцевим радам
  3. розширення механізму прямої демократії шляхом запровадження референдумів, що ініціюються громадянами України
  4. перегляду системи виборів депутатів у парламент (Верховну Раду)

Окремим завданням робочої групи буде залучення якомога більшої кількості активних і кваліфікованих громадян по всій Україні. Їхньою метою буде як внесення пропозицій до проекту змін до Конституції, так і популяризація ідеї необхідності внесення таких змін.

Такий проект змін до Конституції, після схвалення широким колом активістів Євромайдану та інших громадян України, може бути висунутий як офіційна вимога громадянського суспільства до політиків для негайного втілення після обрання нового президента.

P.S.

Сторінка Facebook групи https://www.facebook.com/groups/pciua

Magento with apache httpd 2.4 and php-fpm

After struggling for several hours our being unable to access admin section of our Magento installation when using apache httpd 2.4 configured with php-fpm, we finally found the problem.

Coming from here, we used incorrect ProxyPassMatch, specifically:

1
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/$1

instead of

1
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/$1

Using the 2nd option solved all problems with Magento admin section access.

QuickBooks Error Code 20888 41171 creating / viewing invoices

After switching to QuickBooks 2013 / 13 we started having various problems including crashes with error code 20888 41171 preventing us from creating new or viewing old sales orders or invoices.

It looks like many people experience the same problem, so here is what worked for us: http://support.quickbooks.intuit.com/support/Articles/HOW12420

After running reboot.bat on our accountant’s Windows XP workstation and rebooting crashes with error code 20888 41171 were gone. Hopefully forever.

FreeBSD vs Linux - size matters

As we recently migrated most of our servers from CentOS to FreeBSD, here is a difference between minimum system requirements of Ubuntu Server CLI Installation and FreeBSD 9:

OS FreeBSD 9 Ubuntu Server (CLI) Installation
Processor a 486 or better processor 300 MHz x86 processor
System memory (RAM) 64 MB 128 MB
Disk space 1.1 GB 1 GB

The major difference though between FreeBSD and Linux distros comes from the concept of FreeBSD “base system” which is clearly described by Matt Fuller.