четверг, 17 декабря 2020 г.

Why you should not use Chrome - based «Electron» to make your desktop GUI app

 

The introduction

There are many GUI frameworks out there in the world nowadays. Most of them are closely tied to the programming language: Qt (C++), .Net (C#), “Electron” (JavaScript), Swing and SWT (Java) to mention few. Since JavaScript is a bread and butter for Web UI developers, they think that having Electron is a shortcut to the desktop world and their familiar Web techs fuel their new desktop thing. Apparently so, however it is not fully true.

1. Limited desktop GUI capabilities and user experience.

Lets see what desktop applications lately have been built using Electron: Skype, Slack, Microsoft Visual Studio Code, Tusk (Evernote Client), Discord, WordPress Desktop, newly revealed by Elon Musk’s team - SpaceX Dragon Space Ship touch screen apps etc. We do not see among them any popular game or 3D modeling tool and you know the reason why, the Electron gives you the Web framework only. Everything you can show on a Web page can become a new Electron app. Also, soon you will notice that your “browser” app looks and feels like a Web page with all its slow transitions, heavy CPU cycles, and regular Web page experience. No more, and no less. In other words the Electron is designed for not heavy graphics, it is for entry-level experience “desktop” app creators who learned some Web stack only. Hey Elon, you could save 3-5% money on Electron developers salary for repacking Dragon Web pages into the Electron GUI app :-) Just use regular Chrome or Firefox and bookmarks!

2. Huge resources consumption.

Well, since this Electron app is the only stuff Dragon crew members run on their PC with sensor monitors, then this is not a big deal. Regular users who are running 5-50 small and big apps on their laptops is completely another story. Now, lets imagine that all these small and more advanced apps have been built with the fancy Electron by our happy JavaScript lovers. I started my Slack and Skype apps to see how hungry they are. Skype took 500 MB RAM, Slack eat 500 MB RAM also. Both they occupied 1 GB RAM, nice…. Think please, I started two messengers. I have 16 GB RAM, OS uses 1 GB with all drivers, services etc. Now Skype and Slack came in. I lost 2 GB just for 2 really typical messengers. So, if I will start Discord, then open Visual Studio Code without any files opened, then these Electron based apps will eat up 1 GB more! 2 GB of RAM just for 3 messengers and and a code editor, Electron guys, this is ridiculous! The startup time of these cr...ppy made apps took some CPU and my drive access time. And they are slow despite of the fact I use SSD drive and Intel i7 CPU. I would prefer not to give gigabytes of RAM to communication apps made with Electron, but rather to large test data in my local databases, running VMs on my laptop, and have more RAM for my regular multi-process C++ compile and link tasks.

3. Huge size of any apps.

This is another disadvantage of the Electron framework, you will need to carry the entire Web platform with your app to users. Even if you make a tiny GUI app that targets some network (Web) operations you can not pack the app in a megabyte. Rather you will occupy 300 – 600 MB on your users drive. An the next Electron app will occupy the same amount of space. 10 simple Electron-based apps will eat 3 – 5 GB of your drive space. Huuuhh..

4. Security concerns. 

In a Web browser users have password managers, SSL certificates warning, CORS protection and other security measures - all that learned from Web attacks during decades. What does Electron framework provide and what do JavaScript app developers employ to secure their apps? This is a very big users' concern now.

The conclusion.

If you are entry – level Web developer and wish to enter the desktop app market with a MVP, then this Electron is a “silver bullet” in your hands. And then, be ready to learn really powerful GUI frameworks and compiling programming languages (to avoid frustrations while hunting for bugs and security vulnerabilities). The reason is - your users, they do not want to pay bucks for tens of limited, slow, heavy, buggy (always in the dynamic languages like JavaScript), possibly insecure (due to the lack of experience of JavaScript SDE novices)  and non-native looking Web based apps.

And please, Discord, Skype, Slack teams, rewrite your Electron - based apps with 5-10 times less resource - hungry tech frameworks and programming languages, some people are forced by bosses to use your cr...ppy built apps!

вторник, 10 ноября 2020 г.

Как попасть в свободный Интернет мир

Как уже многие заметили, в некоторых странах Интернет занавес становится плотнее и многие ищут пути получать жизненно важную информацию.

VPN сервисы и скрытая сеть Tor позволяет решить проблему неконстутиционной цензуры. 

Бесплатный и надежный способ - это сеть Tor, но она не является решением абсолютно всех вопросов доступа к информации, например её скорость довольно медленная, как минимум в 8 раз хуже привычной. Кроме того, чтобы настроить конкретное приложение (какую-нибудь Library на устройстве или открыть любимый сайт в браузере) приходится потрудиться. К примеру, если загрузить Tor Browser, запустить его, то в нем не будут работать ввиду принудительных ограничений JavaScript, требуемывй сайтами. Но если запустить Tor Browser и потом заставить обычному приложению (Chrome, Firefox или другой программе) подключаться с Интернет через запущенный клиент Tor Интернет, то вполне себе работает, хоть и медленно.

Второй вариант это купить платный VPN сервис с хорошим рейтингом и забыть о проблемах с цензурой. Недавно обнаружил сервис SurfShark. Если найдется 28 евро на банковской карточке (или эквивалент по курсу), дают VPN на 15 месяцев. С качественным VPN все приложения на настроенном устройстве подключаются к свободному Интернет через VPN (например в ЕС). И нет рекламы и продажи ваших данных третьим лицам.

Есть и некоммерческие сервисы для друзей и населения в в цензурируемых странах. Наверное таких VPN сервисов будет появляться все больше, это дает надежду, что жизненно важная информация всё же останется доступной :-)

понедельник, 4 мая 2020 г.

Как стать программистом



Что можно ответить ребенку младше 18 лет или даже взрослому, у которого появилось желание стать программистом? Может сложиться впечатление, что стать программистом нетрудно и потом можно работать через Интернет и неплохо зарабатывать. К сожалению, подростки, да и взрослые, имея доступ в Интернет попадают под заблуждение, что «в Интернет всё есть», что нужно только «скачать» или «посмотреть курсы». Это верно только отчасти. Да, много (если не большинство) компаний работают распределенно, используя Интернет как связующее звено между сотрудниками и офисами по всему миру. Интернет также соединяет на различных площадках заказчиков и исполнителей. Однако в мире разработки программного обеспечения (ПО) также существует безработица, хоть и обычно меньше, чем в других отраслях; есть трудные боссы и нечистоплотные заказчики. Но самое трудное для школьника или взрослого, решившегося на переквалификацию, обычно является объем знаний и навыков, требуемые для этой работы.
Что можно посоветовать? Для начала скажу банальные вещи, так как все коллеги согласились, что я не дружу с головой, если бы я сказал, что-то типа «прочитай вон ту книжку и станешь классным программистом». Я попробую в одном предложении, ниже по тексту будут подробности. Итак обязательны: пытливый ум и усидчивость, математическая подготовка, разговорный английский, знание самих вычислительных систем, фундаментальные знания алгоритмов, операционных систем и сетей передачи данных, владение 1-2 компьютерными языками — это тот минимум, который дается в 4-х летнем колледже или институте, который поможет приблизиться к цели — стать востребованным инженером-программистом. Такой инженер — программист не побоится пойти на интервью в Amazon, Google, Microsoft или Яндекс и кто-то с третьего-десятого (справедливо) жесткого интервью туда даже попадет работать. Возможно кто-то будет работать не на гигантов индустрии ПО и Интернет, но тоже со временем найдет интересную работу. Если Вы дойдя до этого момента расстроились, то это только потому, что такова реальность. Подготовка занимает годы. Чтобы понять, о чем я пишу, нужно видеть ситуацию как она есть, без «розовых очков». Далее подробно, почему всё именно так.
Разберемся для начала с терминами и специальностями. В ИТ сфере, связанной с программный обеспечением, существуют много специальностей, узкопрофильных областей, в принципе это так же, как в медицине или авиастроении. К примеру, в ИТ есть системные инженеры, которые в основном не пишут программный код, но тем не им также необходима подготовка по нескольким дисциплинам, а крупные компании часто дополнительно требуют сертификацию специалиста по одной или нескольким технологиям. В области сопровождения (администрирования) существуют и менее квалифицированные специалисты, в основном это сотрудники технической поддержки (support или даже «эникейщики»), которые находятся в подчинении менеджеров или системных инженеров. Для простоты далее мы назовем эти роли «инженерная» и «не инженерная». Я опущу область инженеров — системотехников и менее квалифицированных «ремонтников» компьютерной техники, так как эти специальности не являются целью статьи.
По примеру сопровождения информационных систем, собственно процесс разработки, выпуска и поддержки любого программного обеспечения требует как глубокой инженерной подготовки, так и работу тех, кто будет выполнять не инженерную (простую, с точки зрения инженера) работу. Например, существует технология обеспечения качества программного обеспечения (QA) или в более узком смысле тестирования ПО, в этой области требуется знать определенные процессы и технологии; также существует область разработки интерфейсов пользователя (UI), есть работа по верстке HTML страниц для Интернет сайтов. Есть кодировщики, которые знают какой-то язык программирования и не более. Такие не инженерные специальности можно освоить с помощью различных курсов, они могуть стать отправной точкой для будущей, возможно, более общей специализации. Это путь роста «снизу → вверх» из «компьютерщика» / UI-щика / кодировщика далее в инженеры — программисты, который, в свою очередь, обязательно потребует на определенном этапе получения знаний из области инженерии ПО. Рассмотрим, что такого особого в этой инженерии программного обеспечения.
В инженерии программного обеспечения требуется владеть необходимым минимумом знаний. Хочу заметить, что это не какие-то тайные знания, нет, причина в том, что несмотря на множество специализаций, появляющиеся новые технологии и веяния моды (хайпа), инженеры — программисты (software development engineers) прежде всего инженеры. Они смогут понимать язык и работу инженера, кто-то захочет расти по карьерной леснице как менеджеры продукта, архитекторы ПО, тех.директора. Но это возможно только имея знание и понимание, чем занимаются их коллеги и подчиненные. Также на рынке freelance они смогут взяться за «денежный» заказ, который придется «не по зубам» низкоквалифицированным фрилансерам из стран треьего мира, готовым «за еду» продать свою вчерашнюю поделку.
Тогда где и как учиться? Ситуация в России в последние два деятилетия, начиная со школьного и кончая ВУЗами несколько в кризисе. Достаточно сравнить количество и качество научных публикаций в разных странах, чтобы понять, что наука развитых стран и Китая уже обошла науку в РФ, вспомним, например, кто разработал и продвигает стандарт связи 5G. Видя это, компании Яндекс и Mail.ru уже конкурируют с ВУЗами за студентов, так как им удобнее и качественее самим подготовить «под себя» своих будущих сотрудников. Хотя надо отдать должное ведущим школам, которые выживают несмотря на размер всепоглащающего госбюджета «безопасности». В большем выйгрыше выглядят ВУЗы США, Великобритании, Германии, так как в их программах вообще нет того откровенного хлама, который не нужен инженерам — программистам. Да, в таких ВУЗах и колледжах не учат философии, культурологии и истории. Зато уже на втором — третьем курсе студенты получают знания и навыки, которые дают им работу.
Можно ли все освоить самостоятельно, чтобы стать инженером-программистом? Теоретически да. Если есть достаточно много времени и средств - ведь нужно обеспечить себя во время учебы в течении 2-5 лет, то можно успешно учиться самостоятельно. Придется запастись хорошими учебниками и найти либо преподавателей, либо опытных наставников, которые будут направлять весь процесс. Какие предметы / учебники осваивать? В общем это основные дисциплины, которые преподают в техническом коледже или ВУЗе:
  • Разговорный английский. Именно с упором на «разговорный». Критически важно. Требуется не просто «читать и переводить со словарем», а именно достаточно свободно общаться, в том числе с коллегами. Без этого пункта закрыты большинство путей и возможностей в принципе.
  • Разделы высшей математики для ВУЗов: множества, функции, математический анализ, желательно теория вероятностей. Пространственная геометрия если требуется (для 3D моделирования или игр).
  • Устройство современных микропроцессоров. Критически важно. Не нужно учить микрокод популярных процессоров, достаточно знать и понимать каждый компонент микропроцессора и связанных с ним аппаратных элементов.
  • Современные вычислительные системы и параллельное программирование. Критически важно. Знать устройство многопроцессорных систем, процессы, потоки, знание и понимание общих для всех многопоточных систем проблем, такие как «мертвая блокировка», состояние гонки, отсутствие блокировок.
  • Информатика: алгоритмы и структуры данных, блок-схемы. Критически важно. Тут нужно выучить очень много и обязательно с лабораторными работами: алгоритмы поиска и сортировки, теория графов. Нужно понимать большое «О», сложность алгоритмов. Важно понимать баланс память — скорость. Без этого нечего делать в инженерах.
  • Современные операционные системы и системное программное обеспечение. Критически важно. Знать их устройство и понимать как программист взаимодействует с ними, лабораторные обязательно! Нужно знать и понимать как минимум устройство Unix (и похожие на них Linux, MacOS) и Windows. Android и iOS в мобильном мире растут от мира Unix, так что без Unix-подобных операционных систем никак.
  • Компиляторы и интерпретаторы. Критически важно. Обязательно погрузиться в язык С и сделать несколько лабораторных работ с операционными системами (выше). Важно понимать работу препроцессора компилятора, этапы компиляции и компоновки. Разобратья как работают интерпретаторы на примере Python или JavaScript. Дальнейшее развитие зависит от изучающего, как минимум один из них: C++17, Rust, Dart, Go, Java. Я не говорю, что после изучения именно этих языков программирования можно стать инженером — программистом, я говорю о минимуме знаний. На этом этапе пригодятся знания об устройстве операционнах систем и взаимодействие с ними.
  • Криптография и защита данных. Важно. Хэширование, симметричное и ассиметричное шифрование, современные реализации шифрования в сети Интернет. Вот тут и пригодится математика.
  • Сети передачи данных и Интернет. Критически важно. Устройство сетей, виды протоколов, лабораторные работы, например многопоточный UDP и TCP сервер и клиент. Тут уже нужны все знания до этого пункта.
  • Современные реляционные и нереляционные базы данных. Важно. Лабораторные обязательно! Важен практический опыт с SQL и NoSQL языками, их DDL, DML и так далее. Пригодится теория множеств.
Это и есть те самые знания, которые приближают человека к инженерии программного обеспечения. Для дальнейшего развития придется осваивать архитектурные шаблоны и паттерны программирования, а в зависимости от специализации еще и дюжину нужных инструментов: IDE, git, CASE, Bash, openssl, «облачные» сервисы.... Гораздо надежнее отыскать не поверхностные курсы по каким-то технологиям, а систематизирующие знания качественные ВУЗовские учебники, а потом, осваивая науку по учебникам, заведя тетрадки по предметам и делая лабораторки, подсматривать непонятную информацию в Интернет. Курсы хороши тогда, когда они полностью покрывают конкретную востребованную область инженерии или являются дополнением к учебнику.
Мне стало любопытно, какие же существую в 2020 году на русском языке учебники и справочники, которые помогут в самостоятельном обучении будущему инженеру — программисту. Попробую проанализировать. Также в будущем я в общих чертах хотел бы описать какие технологии потребуются при специализации в каждой области:
  • разработка ПО для предприятий
  • разработка Интернет сервисов
  • создание коммерческих продуктов
  • мобильная разработка для iOS и Android.

To be continued...

пятница, 28 февраля 2020 г.

Clcache to speed up rebuilds of large Visual C++ projects

Caching tool for Microsoft Visual C++ compiler to speed up rebuilds of large Visual C++ projects

On Windows with Microsoft Visual Studio and C++ compiler its not easy to use very effective and popular ccache. Still when you change a line of code and have to wait a half an hour for the solution is being rebuild then it forces to find a solution for caching of obj files. Incremental builds with /Zi option help but in case of switching git branches or changing some base class you will be forced to rebuild entire project or solution.
You can try to use a patch for ccache to cache C++ builds in Microsoft Visual Studio. Another way is clcache project. Here is the recepie:

1. Get clcache.exedistribution or build clcache.exe from sources

  • To setup clcache.7z extract the archive to some folder (e.g. C:\TEMP\clcache), the archive contains clcache.exe which is compiled Python source code and support libraries. The clcache.exe is built using Python 3.7 and PyInstaller Python module.
  • Another way is to make clcache.exe from source: https://github.com/frerich/clcache

2. Setup cl compiler

See «Integration for Visual Studio» or follow the next steps:
The next step will tell clcache that the original compiler to forward calls to is no longer available using the default name. See Visual Studio 2017 Community path to cl.exe:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.15.26726\bin\Hostx86\x64
Some users have reported (see e.g. #18) that in order to make Visual Studio pick up clcache, the original cl.exe compiler binary you need to rename:
Rename cl.exe to e.g. cl_original.exe
Rename cl.exe.config to e.g. cl_original.exe.config
Copy the generated (or use distributed) clcache.exe file to the folder with cl_original.exe (original cl compiler) and rename clcache.exe toi cl.exe.
Copy all other files from the distributive archive to the same folder with cl_original.exe file.
So the idea is to cheat Visual Studio and make it to use clcache.

3. Set environment variables to use clcache

Set CLCACHE_CL environment variable to point to cl_original.exe:
CLCACHE_CL=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.15.26726\bin\Hostx86\x64\cl_original.exe

In order to solve an issue with timeouts set environment variable to 100 seconds timeout:
CLCACHE_OBJECT_CACHE_TIMEOUT_MS=100000

4. Use /Z7 compiler option in all C++ projects in order to generate appropriate format of binary files

The /Z7 option produces object files that also contain full symbolic debugging information for use with the debugger. These object files and the built executable can be substantially larger than files that have no debugging information. The symbolic debugging information includes the names and types of variables, as well as functions and line numbers. No PDB file is produced.
Another option is to use some environment variable like CL_Z_OPTION to use its value in Visual Studio projects options:
CL_Z_OPTION=/Z7
Then in All options settings of your project in Visual Studio you will add to the end:
%CL_Z_OPTION%

5. Configure clcache storage capacity to keep all your object files

If you have over 1 GB of objects files then default settings of clcache are not enough so please enlarge the cache size to the required one. Go to the folder with clcache.exe and run this command to setup 4 GB cache in bytes:
clcache.exe -M 4294967296

6. Check clcache statistics

Run "clcache.exe -s" to check the effectiveness of the settings. Pay attention to cache misses. Then more cache hits and less cache misses then more effective your clcache is configured.