Saturday, August 19, 2017

Fast autocomplete using Python and Redis

Fast autocomplete using Python and Redis

General information

Problem

Imagine situation when you need provide autocomplete for some data list. In case when you using SQL probably you will do something like this:

select * from table_name where table_field like 'search%'
 
Probably you know, that when you database contains significant amount of data you will get essential decreasing of data processing.

Wednesday, April 19, 2017

N-Queens problem solving program

N-Queens problem solving program


N-Queen problem - you need N chess queens on a chess board with dimensions NxN in a way that they do not threat each other (according to chess rules).

Program can find all possible solutions for N-dimensional board. Also, program able to print available solutions to console or to the file.

Here is my solution in Python language: https://github.com/JFF-Bohdan/nqueens (MIT license)

Wednesday, April 12, 2017

Yet Another Tiny Backup

Yet Another Tiny Backup


General information

Backup tool for one of my production instances. It implements very simple logic for my special requirements.

Algorithm: yatbackup can compress whole folder using specified archiver. In case, when another backup with same hash available in destination folder, new archive will be deleted.

Yes, it's all.

Why do I need it? I need create backup of some folder using cron, but I don't need duplicate archives.

Also, I need to understand that utility successfully finished, even no new archives was created.

Source code and documentation available here: https://github.com/JFF-Bohdan/yatbackup

Monday, April 3, 2017

pynvr - Python NVR (Network Video Recorder) based on OpenCV.

pynvr - Python NVR (Network Video Recorder) based on OpenCV.

Source can be found here: https://github.com/JFF-Bohdan/pynvr

General information

pynvr can interract with cameras using OpenCV (supports many types of connection including connection to USB cameras and network cameras using RTSP, for example)
Captured video stream must be analysed for motion and then saved to files according to specific rules.

When motion detected (or rule triggered) not only video after start must be saved but some frames before (pre-alarm/pre-event frames) must be saved to output file.

Tuesday, March 7, 2017

О проекте TapVisor


О проекте TapVisor 

Предназначение системы


Система предназначена для сбора информации с распределённой сети датчиков, хранения информации о событиях и обработке данных - выдачи уведомлений о наступлении тех или иных событий, построении отчётов, выдаче аналитических срезов.

Система ориентирована на B2B и представляет из себя SaaS. Клиент создаёт в системе организацию к которой подключаются источники данных, собирающие информацию на торговых точках или точках автоматизации.

Система спроектирована максимально абстратно, таким образом можно собирать самую разнообразную информацию и автоматизировать такие задачи как:
  1. контроль температурного диапазона;
  2. контроль влажности;
  3. сбор информации о торговле товаром;
  4. контроль налива жидкого товара;
  5. контроль наличия объекта на базе - например для проката.
В данный момент система собирает такую информацию:
  1. события о продажах вина и пива;
  2. прокат туристического оборудования на точках проката;
  3. температуру на большом количестве пивных кранов в пабе.
При необходимости, к системе могут быть подключены новые источники данных. Например, если клиенту необходимо считать сколько человек проходит сквозь дверной проход, мы можем разработать контроллер для подсчёта проходящих людей и передачи событий на центральный сервер. После чего клиент сможет в веб-интерфейсе просматривать информацию о количестве людей, прошедших сквозь дверной проход.

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

Для сбора информации могут быть использованы как специализированные контроллеры так и решение с необслуживаемыми компьютерами - Raspberry Pi, Orange Pi, etc. Такое решение позволяет максимально быстро выполнить автоматизацию объекта, а в дальнейшем, при необходимости произвести специализированный контроллер.

Система изначально проектировалась для работы с клиентами из разных часовых зон, события в центральной БД имеют несколько атрибутов дата/время, с учётом временных зон. При проектировании контроллеров и кеширующих узлов на базе RPi максимальное внимание было уделено работе в среде с задержками и сбоями при передаче данных. Для обеспечения безопасности, передача данных осуществляется с использованием RSA + PKCS1_v1_5 + AES (для мощных кеширующих узлов) либо с использованием алгоритма Speck для слабых контроллеров.

Где и как это можно увидеть

В системе предусмотрен демо-режим, позволяющий ознакомиться с интерфейсом, для полученя доступа к демо-режиму можно войти в систему http://tapvisor.com с таким данными:
Login    : "demo" (без кавычек)
Password : "demo" (без кавычек)

В этом режиме можно увидеть часть функциональности, доступной владельцу организации подключённой к сервису TapVisor. Эта демо-организация состоит из трёх торговых точек по продаже пива:

  1. Cork / Пробка
  2. Roger's Place / У Роджера
  3. The Pub / Пивбар
и торгуёт такими товарами:
  1. Ginger Beer / Имбирное
  2. Lager Beer / Светлое
  3. Light Ale / Эль
  4. Porter / Тёмное 
Среди виджетов можно отметить такие:
  • Sales - выручка по магистралям за сегодня и вчера;
  • Dashboard - аналитика по продажам, более подробно вы можете прочитать тут http://tapvisor-help-ru.aminis.com.ua/dashboard
  • Charts - здесь можно построить графики о продажах по часам, по дням;
  • Reports/Sales-products - информация о продажах товара с возможностью наложения фильтров по точкам, дням;
  • Director of the world - карта с отметками всех точек. Цветом и текстом можно визуализировать самую важную информацию: выручку за день, состояние остатков, то насколько был выполнен план на день и т.д.;
  • Stock/Parameters - контроль остатков на точке, предоставляется информацию о том сколько товара того или иного типа осталось на магистралях точки;
  • Reports/All events - список все событий, происходящих на точке
Особенности режима:
  1. в этом режиме нет доступа к изменению настроек;
  2. предоставляется доступ к данным с 2017-02-20;
  3. предоставлен доступ не ко всем виджетам;
  4. возможности системы и распределение возможностей по тарифам можно посмотреть тут: http://tapvisor.com/tariffs

Как это устроено внутри


 Back-end

Система написана на Python, используя Flask и SQLAlchemy. В качестве СУБД используется PostgreSQL, для LRU кеша использован Redis. Используется связка nginx и uwsgi.

Для оптимизации скорости выполнения запросов используется:
  1. roll-up's (свертки) для  событий, используемых для построения Dashboard;
  2. sharding - на базе Citus single-machine cluster с некоторым количеством worker'ов, обрабатывающих шарды. Шардинг используется в режиме multi-tenant application c table co-location, что обеспечивает обработку SQL запросов в пределах одного шарда;
  3. фоновое вычисление данных которые могут в будущем понадобиться пользователю;
  4. кеширование результатов запросов и тех данных, что могут понадобиться пользователю в Redis;
  5. концепция "горячего архива" - архив за последние несколько дней для "горячих клиентов" (активных пользователей). Более старые события хранятся в "обычном/холодном архиве";
Используемая OS - Debian.

Настроена автоматическая репликация баз данных, автоматическое создание и передача резервных копий БД.

Front-end

Используется TypeScript и Bootstrap, позволяющий корректно отображать сайт на старых версиях iOS и обеспечивающий совместимость с максимальным количеством браузеров.

Используемые библиотеки: Nodejs + webpack + typescript + jQuery + bootstrap 
 
Для визуализации графиков используются  Highcharts

Визуализация таблиц (с поддержкой тонких настроек рендеринга, pagination и динамической подгрузки данных) -  DataTables.

Как это было сделано

Для управления проектом использовалась такие инструменты как:
  1. Redmine - управление проектом;
  2. git - контроль версий;
  3. Google Drive/Google Docs - хранение протоколов, документации на узлы системы, описание протоколов взаимодействия узлов системы.
Подобный подход позволил максимально эффективно, с наименьшим уровнем бюрократии и минимальной тратой времени, выполнять действия и координировать работу всех разработчиков.

После того как в системе были накоплены  данные мы приступили к оптимизации, проходившей по следующему алгоритму:
  1. мы выявляли медленно работающие виджеты и сопоставляли фактически обнаруженное с нашими предсказаниями о том, что и как будет замедляться;
  2. выполняли профилирование;
  3. искали методики, позволяющие выполнить оптимизацию;
  4. тестировали и внедряли решение по оптимизации.
Что самое важное в оптимизации? Можно отметить такие моменты как:
  1. накопление данных в БД, при этом параллельно необходимо выдвигать предположения о том какие  ожидаются результаты по работе того или иного виджета;
  2. тщательное профилирование и поиск того что на самом деле медленно работает, а только затем оптимизация.
Надеюсь вам нравится результат.

Приятного использования.

Tuesday, January 31, 2017

Checking Debian Linux user password without logging into system

Checking Debian Linux user password without logging into system

Problem


Imagine situation when you need to check a user's password without logging into system and any traces of action. I had this situation when I was able:
  1. can execute sudo command;
  2. I needed to check password of root user from my machine. Also, I was not interested of  password change for root user.
 Note: you can check password for any user of your system.


Wednesday, January 25, 2017

Building Python 3.6 on Raspberry Pi 3 from sources (clean Debian)

Building Python 3.6 on Raspberry Pi 3 from sources (clean Debian)

 

1. Problem


By default clean Debian installation contains Python version 2.7.9 on my Debian (Raspbian GNU/Linux 8 (jessie)"). But we want more! We need Python 3.X, this tutorial shows you how to install Python version 3.6.0 .

Warning! Newer versions of Debian for Raspbery Pi have SSH disabled, so you need enable it by creating empty file with name ssh (Yes, just three letters. Yes, without extension) in /boot section of SD-card. This section also visible under Windows, so you will have no problems to do this.

Note: This is updated version of my previous tutorial Building Python 3.5 on Raspberry Pi 2 (Raspbian) which fixes issues with TLS/SSL support of compiled Python.


Tuesday, January 10, 2017

ACT LED Heartbeat for Raspberry Pi


All models of Raspberry Pi have ACT led. ACT led ON when SD card in use and OFF otherwise. 



Except of Raspberry Pi Zero, this devices uses opposite rules - ACT led is always ON and OFF only when SD card in use. This is useful because Raspberry Pi do not have PWD led and you can't understand is it powered on or not.

I like to tune ACT led to be in heartbeat mode, in this mode ACT led blinks twice than pause and again. This is useful because you can understand that device not just powered but also Linux kernel active. 

All that you need just add one line to config.txt file located in /boot partition of SD card.

Note: /boot partition have FAT fs, so you can do all operations directly from Windows OS just by editing text file.

From Linux (Raspbian for example) you need execute
$ sudo nano /boot/config.txt

Then navigate to the end of file and add line:

dtparam=act_led_trigger=heartbeat

That's all. After reboot your ACT led will act in heartbeat mode.

Enjoy!

Monday, January 9, 2017

Raspberry Pi Zero USB dongle (use SSH over USB cable like over Ethernet)

Raspberry Pi Zero USB dongle (use SSH over USB cable like over Ethernet)

About post

Imagine, if you will be able to use SSH (or even VNC) connection to your Raspberry Pi Zero using only USB cable without any hardware modifications. Amazing, isn't it?

You can find other instructions on Youtube requires hardware modification, but you can do this without soldering and so on.

All you need to follow these instructions.

Connecting to your Raspberry Pi without monitor, keyboard and mouse. Quick start.

Connecting to your Raspberry Pi without monitor, keyboard and mouse. Quick start.

 About article

Imagine if you want your own Linux server for debugging and testing purpose. Of course you can buy VPS, but this is can be a little bit expensive for some cases. In this case you can use just Raspberry Pi which able to run Apache, Nginx, PostgreSQL.

So you need your RPi + PSU (Power Supply Unit) and RTC (preferred). 

But you need to configure your RPi, so you need keyboard, monitor, mouse, HDMI adapters and so on. Right? Wrong! Your do not need anything except RPi + PSU + RTC (optional).